Einzelnen Beitrag anzeigen

Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#12

Re: Container-Klassen in C#

  Alt 15. Nov 2007, 14:57
Zitat von Luckie:
Ist da irgendein schwerwiegender Fehler drin?
Ja, eine Menge unnötigen Code.
Kompilere einmal dein Projekt, gehe jetzt mal in den Form designer und oben im Menü klickst du auf du Data\Show data sources.
Nun legst du in dem neuen Toolwindow eine neue Data source an, im Dialog wählst du Object aus und im nächsten Schritt kannst du deine Klasse "Person" auswählen -> Finish.
Jetzt kannst du einfach die Eigenschaften Name und Vorname auf dein Formular.
Die Textboxes sind jetzt an diese beiden Eigenschaften in der PersonBindingSource gebunden, die ebenfalls auf dem Form liegt.
Willst du den Navigator nicht haben, kannst du ihn einfach löschen.
Jetzt noch eine ListBox auf dein Form ziehen, und ihr als DataSource die personBindingSource verpassen.


Mehr muss im Form nicht stehen, um all das zu können, was dein Code gemacht hat:

Code:
public partial class Form1 : Form
{
  readonly BindingList<Person> persons = new BindingList<Person>();

  public Form1()
  {
    InitializeComponent();
    personBindingSource.DataSource = persons;
  }

  private void personBindingSource_ListChanged(object sender, ListChangedEventArgs e)
  {
    deleteButton.Enabled = personBindingSource.Position != -1;
    nameTextBox.Enabled   = deleteButton.Enabled;
    vornameTextBox.Enabled = deleteButton.Enabled;
  }

  private void addButton_Click(object sender, EventArgs e)
  {
    personBindingSource.AddNew();
  }

  private void deleteButton_Click(object sender, EventArgs e)
  {
    personBindingSource.RemoveCurrent();
  }
}

In der Klasse würd ich halt INotifyPropertyChange implementieren, um die UI (oder andere) über Änderungen informieren zu können.
Außerdem habe ich noch ToString überschrieben, da das der Defaultwert ist, den eine ListBox darstellt.
Code:
public class Person : INotifyPropertyChanged
{
  string name;
  string vorname;

  public override string ToString()
  {
    return name + ", " + vorname;
  }

  public string Name
  {
    get { return name; }
    set
    {
      if (name == value) return;

      name = value;
      RaisePropertyChanged("Name");
    }
  }

  public string Vorname
  {
    get { return vorname; }
    set
    {
      if (vorname == value) return;

      vorname = value;
      RaisePropertyChanged("Name");
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;
  protected void RaisePropertyChanged(string propertyName)
  {
    PropertyChangedEventHandler h = PropertyChanged;

    if (h != null)
      h(this, new PropertyChangedEventArgs(propertyName));

  }
}
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat