Laden...

Fehler bei UserControls auf Form hinzufügen

Letzter Beitrag vor 2 Jahren 13 Posts 515 Views
Fehler bei UserControls auf Form hinzufügen

Hallo,

ich habe ein UserControl erstellt und möchte dieses nun auf einer TabPage auf meiner Form einbinden.
Beim Hinzufügen über den Designer erhalte ich die Fehlermeldung

"Fehler beim Erstellen der Komponente userControl1
System.MissingMethodException: Der Konstruktor für den Typ userControl1 wurde nicht gefunden.
...

Woran liegt das? Bzw. wie kann ich das Problem beheben?

Klingt danach, das dein UserControl ohne den Default Konstruktor daher kommt.
Vermutlich willst du irgendwelche Parameter an deinen Konstruktor geben, was bei Controls im Designer nicht funktioniert.

Ansonten zeig mal den Code deines Controls.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

Nun habe ich den Konstruktor des UserControl ohne Parameter erstellt.
Allerdings bekomme ich nun wieder bereits beim Hinzufügen auf die Form die folgende Fehlermeldung:

Anbei mal der Code:

System.TypeInitializationException: Der Typeninitalisierer für Projektname.AppConnction hat eine Ausnahme verursacht.
Syste.NullReferneceException: Der Objektverweis wurde nicht aus eine Objektinstanz festgelegt.

Das hier ist meine AppConnection:


 public static class AppConnection
    {
        public static string ConnectionString = ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
}

UserControl:


public partial class userControlKunde : UserControl
    {
        IKundeRepository kundeRepository;

        public event DataGridViewCellEventHandler dg_CellDoubleClickEvent;

        public userControlKunde()
        {
            InitializeComponent();
            AufrufUebersicht();
        }
private void userControlKunde_Load(object sender, EventArgs e)
        {
            this.dataGridView1.CellDoubleClick += dg_CellDoubleClickEvent;
        }

 void AufrufUebersicht()
        {
                  kundeRepository = new KundeRepository();
                  var kndDaten = kundeRepository.AlleKundendaten().ToList();
                  dataGridView1.DataSource = kndDaten;
}


        private  void dg_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            dg_CellDoubleClickEvent?.Invoke(this.dataGridView1, e);
        }
    }

Form:


 public partial class Form_Kunde : Form
    {
       
        userControlKunde  uc = new userControlKunde ();

 
        public Form_Kunde())
        {
            InitializeComponent();
            AufrufKndUebersicht();
        }
        private void Form_Kunde_Load(object sender, EventArgs e)
        {
            uc.dg_CellDoubleClickEvent += new DataGridViewCellEventHandler(dataGridView1_CellDoubleClick);
        }

        private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            MessageBox.Show("TETS");
        }
...


Zumindest konnte ich nun die Zeile finden, wo es Probleme gibt.
Leider weiß ich nicht, wie ich dies beheben kann.

In meinem UserControl greife ich auf ein Repository zu, das ich auch auf meiner Form verwende.

Kommentiere ich im UserControl folgenden Code aus, dann könnte ich das UserControl auch übernehmen:


void AufrufUebersicht()
        {
                  kundeRepository = new KundeRepository();
                  var kndDaten = kundeRepository.AlleKundendaten().ToList();
                  dataGridView1.DataSource = kndDaten;
}

D.h. die Zeile

var kndDaten = kundeRepository.AlleKundendaten().ToList();

macht Probleme.

Ich vernwende auf der Form zwar einen anderen Namen, kundenDaten anstatt kndDaten, aber das hilft nicht.

Kann mir bitte jemand helfen, wie ich das Problem lösen kann - danke!

Wo verwendest du den anderen Namen?
Ansonsten solltest du mal einen Test anlegen oder deinen Code Debuggen.
Klingt dann sehr nach einem Fehler in deinem Code.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

Soetwas gehört auch nicht in dem Konstruktor aufgerufen.

Wenn das Control im Designer angezeigt wird, wird es per new angelegt.
Woher soll es dann diese Verbindung her haben?

Mach es im OnLoaded und gut.

Hab nochmals alles gelöscht und neu angelegt.
Nun klappt es. Danke für Eure Hilfe!

Leider hat sich das Problem doch noch nicht erledigt.

Ich habe das UserControl versucht auf der TabPage einzufügen. Da erhalte ich die dann die Fehlermeldungen - siehe Bild.
Der Fehler tritt ja nicht erst beim Start des Programmes auf, sondern bereits im Designer.

Folgendes habe ich gefunden, was ich denke, auf mein Problem zutrifft.

This problem can be caused if a class tries to get value of a key in web.config or app.config which is not present there.

e.g.
The class has a static variable

private static string ClientID = System.Configuration.ConfigurationSettings.AppSettings["GoogleCalendarApplicationClientID"].ToString();  
  

But the web.config doesn't contain the GoogleCalendarApplicationClientID key

The error will be thrown on any static function call or any class instance creation

Kann mir bitte jemand zu helfen, wie ich das Problem lösen kann?

Wie von FZelle schon geschrieben, darfst du im UserControl-Konstruktor nicht auf Laufzeitinformationen (wie z.B. eine Konfiguration) zugreifen, sondern lagere diesen Code in eine andere Methode (z.B. OnLoad) aus.

Das mache ich doch, oder nicht?


public partial class userControlTest : UserControl
    {     
        public userControlTest()
        {
            InitializeComponent();
        }
       

        private void userControlTest_Load(object sender, EventArgs e)
        {
            IDatenRepository datenRepository new DatenRepository ();
            var kndDaten = datenRepository.AlleKunden().ToList();
            dataGridView1.DataSource = kndDaten;
        }

Ja, so sollte es funktionieren.
Erhältst du denn keine Fehlermeldung mehr, wenn du den Code in der Load-Methode mal auskommentierst?
Oder hast du noch einen anderen Zugriff auf die AppConnection? Bedenke, daß die ganze Assembly vom Designer geladen wird (und dabei zuerst auch alle statischen Variablen automatisch initialisiert werden), d.h. du solltest diese also erst zur Laufzeit initialisieren.

Edit:
Du könntest mal versuchen, die Initialisierung auf den statischen Konstruktor auszulagern (d.h. erst beim ersten Zugriff auf die Klasse):


public static class AppConnection
{
    static AppConnection()
    {
         ConnectionString = ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
    }

     public static /*readonly*/ string ConnectionString; // falls dieser String zur Laufzeit nicht mehr geändert wird, dann 'readonly' noch hinzufügen
}

Wenn der Code im Load auskommentiert ist, kann ich das UserControl problemlos hinzufügen.

Zugriff auf die AppConnection habe ich noch auf der Form, auf der das UserControl eingefügt werden soll.

Dann frage mal DesignMode im Load-Event ab (auch wenn dies nicht immer gut funktioniert: Windows Forms designer and DesignMode property issues).

Und wenn das auch nicht funktioniert, dann bleibt dir nichts anderes übrig, als daraus eine eigene öffentliche Methode (also wie in deinem 2. Beitrag: AufrufUebersicht()) zu erzeugen und diese dann von deiner Form-Klasse aus aufzurufen.