So binden Sie Steuerelemente an eine Objektdatenquelle in einem WinForms-App-Projekt (.NET Core).

 C Programming >> C-Programmierung >  >> Tags >> .NET
So binden Sie Steuerelemente an eine Objektdatenquelle in einem WinForms-App-Projekt (.NET Core).

Das manuelle Zuordnen von Klassen zu UI-Steuerelementen ist wahrscheinlich das Langwierigste, was Sie beim Codieren tun können. Um diesen Programmieraufwand zu minimieren, können Sie Ihre Steuerelemente an eine Objektdatenquelle binden. In diesem Artikel zeige ich, wie Sie dies in einem WinForms-App-Projekt (.NET Core) tun. Zunächst zeige ich Schritt für Schritt, wie Sie die Bindung über die Benutzeroberfläche konfigurieren (sowohl in VS2019 als auch in VS2022). Anschließend zeige ich, wie die Bindung programmgesteuert konfiguriert wird (einschließlich eines Beispiels für die automatische Bindung basierend auf einer Namenskonvention).

1 – Klasse hinzufügen

Fügen Sie eine Klasse mit öffentlichen Eigenschaften hinzu, die Sie an die Formularsteuerelemente binden möchten. Um dies einfach zu halten, fügen wir eine Klasse mit einer einzelnen String-Eigenschaft hinzu, die wir an ein Textfeld binden möchten.

public class Coder
{
	public string Name { get; set; }
}
Code language: C# (cs)

2 – Bindungsquelle hinzufügen

Fügen Sie dem Formular ein BindingSource-Steuerelement hinzu, und legen Sie Ihre Klasse als Objektdatenquelle fest. Auf diese Weise können Sie zur Entwurfszeit Steuerelemente an Ihre Klasseneigenschaften binden. Die Schritte zum Hinzufügen einer BindingSource wie dieser unterscheiden sich für VS2019 und VS2022, sehen Sie sich also den entsprechenden Abschnitt unten an.

In VS2022

So fügen Sie eine BindingSource mit einer Objektdatenquelle in VS2022 hinzu:

  • Fügen Sie dem Formular ein BindingSource-Steuerelement hinzu.
  • Klicken Sie in den BindingSource-Eigenschaften auf Datenquelle und Neue Objektdatenquelle hinzufügen
  • Wählen Sie Ihre Klasse aus der Liste aus und klicken Sie auf OK.

Hinweis:Wenn Sie Ihre öffentliche Klasse nicht sehen, erstellen Sie das Projekt neu und versuchen Sie diesen Schritt erneut.

  • Klicken Sie in den BindingSource-Eigenschaften auf Datenquelle und wählen Sie Ihre Klasse aus (Andere Datenquellen> Projektdatenquellen> Coder ).

In VS2019

So fügen Sie eine BindingSource mit einer Objektdatenquelle in VS2019 hinzu:

  • Fügen Sie dem Projekt eine Datei namens Coder.datasource hinzu mit dem folgenden XML (mit Ihren eigenen Klassentypinformationen):
<?xml version="1.0" encoding="utf-8"?>

<GenericObjectDataSource DisplayName="Coder" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
  <TypeInfo>WinFormsProject.Coder, WinFormsProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
</GenericObjectDataSource>
Code language: HTML, XML (xml)

Hinweis:Dies ist erforderlich, da VS2019 nicht über den Assistenten „Neue Objektdatenquelle hinzufügen“ verfügt.

  • Fügen Sie dem Formular ein BindingSource-Steuerelement hinzu.
  • Klicken Sie in den BindingSource-Eigenschaften auf Datenquelle und wählen Sie Ihre Klasse aus (Andere Datenquellen> Projektdatenquellen> Coder ).

Wenn Ihr Klick nicht ausreicht, überprüfen Sie die Informationen zum Klassentyp in der Coder.datasource Datei und neu erstellen.

3 – Binden Sie ein Steuerelement über die BindingSource an eine Eigenschaft

  • Fügen Sie dem Formular ein TextBox-Steuerelement hinzu.
  • Klicken Sie in den Eigenschaften der TextBox auf Datenbindungen> Erweitert> klicken Sie auf die Schaltfläche […].
  • Wählen Sie die zu bindenden Eigenschaften aus und klicken Sie auf OK. In diesem Beispiel binden wir coderBindingSource.Name mit TextBox.Text Eigentum.

4 – Legen Sie im Code BindingSource.DataSource auf ein Objekt fest

Nachdem die Bindungskonfiguration abgeschlossen ist, können Sie die Bindung vornehmen, indem Sie BindingSource.DataSource wie folgt auf eine Objektinstanz im Code festlegen:

public frmCoder()
{
	InitializeComponent();

	var coder = new Coder() { Name = "Bob" };
	coderBindingSource.DataSource = coder;
}
Code language: C# (cs)

Dies bindet an das Coder-Objekt, wenn das Formular initialisiert wird, und zeigt den Coder.Name im gebundenen Textfeld an:

Sie können die anfänglichen Objektdaten von überall abrufen – einer Datenbank, einer API, einer Konfigurationsdatei oder sogar fest codiert. Stellen Sie nur sicher, dass Sie BindingSource.DataSource festlegen, wenn Sie eine neue Instanz haben.

Konfigurieren Sie die Bindungen programmgesteuert

Alle vorherigen Schritte haben gezeigt, wie die Bindungen zur Entwurfszeit konfiguriert werden, um den Codierungsaufwand zu minimieren. Wenn Sie möchten, können Sie Bindungen stattdessen programmgesteuert hinzufügen, indem Sie IBindableComponent.DataBindings.Add() aufrufen für jedes Steuerelement, das Sie binden möchten, wie folgt:

public frmCoder()
{
	InitializeComponent();

	var coder = new Coder() { Name = "Bob" };
	txtCoder.DataBindings.Add(nameof(TextBox.Text), coder, nameof(Coder.Name));
        //This means bind coder.Name -> txtCoder.Text
}
Code language: C# (cs)

Hinweis:Achten Sie darauf, dieselbe Bindung zweimal hinzuzufügen. Dies führt zu einer Laufzeitausnahme. Wenn Sie bereits Bindungen über die Benutzeroberfläche hinzugefügt haben, achten Sie darauf, sie zu entfernen, wenn Sie diesen programmatischen Ansatz verwenden.

Wenn das Formular gestartet wird, zeigt das Textfeld „Bob“ (von Coder.Name).

Programmgesteuerte automatische Bindung

Wenn Sie Steuerelemente automatisch an Eigenschaften in Ihrer Klasse binden möchten, können Sie die Formularsteuerelemente durchlaufen und DataBindings.Add() für jedes Steuerelement aufrufen. Hier ist ein Beispiel für die automatische Bindung von Steuerelementen (der Kürze halber nur Textfelder) mit einer einfachen Namenskonvention:

var coder = new Coder() { FullName = "Bob" };

//Auto-bind by naming convention (coder.Property.Name == control.Name)

var coderPropNames = coder.GetType().GetProperties().Select(t => t.Name).ToHashSet();
foreach (Control control in this.Controls)
{

	if (!coderPropNames.Contains(control.Name))
		continue;

	switch (control)
	{
		case TextBox txt:
			txt.DataBindings.Add(nameof(txt.Text), coder, txt.Name);
			break;
		//add other control types here
	}
}
Code language: C# (cs)

Hinweis:Wenn Sie diese zu einfache Namenskonvention verwenden, würden Sie sehr wahrscheinlich irgendwann auf eine Namenskollision stoßen, was zu einem ziemlich verwirrenden Fehler bei der Kompilierung führt (z. B.:„Kann nicht von Zeichenfolge in Control konvertieren“). Die Steuerelementnamen dürfen nicht mit bestehenden Formulareigenschaftsnamen identisch sein (d. h. „Name“ kann nicht verwendet werden, da „form.Name“ vorhanden ist) .

Hier besteht natürlich das Risiko, dass die Steuerelementnamen und Klasseneigenschaftsnamen nicht mehr synchron sind. Wenn Sie sich für diesen Ansatz entscheiden, sollten Sie versuchen, diese Szenarien im Voraus zu erkennen, damit Sie in Zukunft keine Zeit mit dem Debuggen verbringen müssen.