Entwickler-Ecke

WinForms - Zugriff aufs DataSet und Aktualisieren des DGVs


BlackMatrix - Di 31.01.12 22:24
Titel: Zugriff aufs DataSet und Aktualisieren des DGVs
Guten Abend.

Ich habe mir ein typisiertes DataSet angelegt, dass die Benutzerdaten speichert. Das DataSet ist an das DGV gebunden. Mein DGV besitzt außerdem ein ContextMenu mit den Auswahlmöglichkeiten Start und Stop.

Nun möchte ich gerne, dass mein Benutzer eine bestimmte Anzahl Einträge im DGV auswählt und diese mit einmal starten bzw. stoppen kann.

Ich habe das ContextMenuClickEreignis abboniert und möchte nun gerne, in dieser Ereignisroutine, alle Objekte starten, die markiert wurden:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
        private void ToolStripMenuItemClick(object sender, EventArgs e)
        {
            foreach (DataGridViewRow row in dataGridView1.SelectedRows)
            {
                        // Wie komme ich hier an die Elemente die ich für Start bzw. Stop benötige?
                        // row.DataBoundItem ...
            }
        }



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
// Person.cs
    public class Person: INotifyPropertyChanged
    {
        private int _kinder;

        public string Vorname{ get; set; }
        public string Nachname{ get; set; }
        public int Kinder
        {
            get { return _kinder; }
            set  
            {
                _kinder= value;
                OnPropertyChanged(new PropertyChangedEventArgs("Kinder"));
            }
        }

        protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            PropertyChangedEventHandler propertyChangedEventHandler = PropertyChanged;
            if (propertyChangedEventHandler != null)
                PropertyChanged(this, e);
        }

        public void Start()
        {
            // Start...
        }

        public void Stop()
        {
            // Stop...
        }


Mein 2. Problem:

Jedes Objekt welches gestartet wird, packe ich in den ThreadPool. Wie erreiche ich nun, dass nun das DGV immer die aktuelle Anzahl der Kinder anzeigt? Der PropertyChangedEventHandler ist immer null :-/

MfG BlackMatrix


Ralf Jansen - Di 31.01.12 23:38

Du zeigst eine Person Klassen und erzählst aber irgendwas von einem Dataset. Wie passt das zusammen?

Wenn du Instanzen von Person gebunden hast und du Änderungen an dieser Instanz nicht siehst dann würde ich mal vermuten (den wirklich interessanten Codeteil zeigst du leider nicht) das du die Instanz nicht über die Properties änderst sondern direkt über die Felder. Nur Änderungen die durch den Property Setter laufen feuern natürlich auch das PropertyChanged Event.

Zitat:
Der PropertyChangedEventHandler ist immer null :-/


Wo ist der null und wie ist Person gebunden.


BlackMatrix - Mi 01.02.12 00:30

.....


BlackMatrix - Fr 03.02.12 15:03

Hab den Fehler gefunden, hatte aus Versehen eine neue Instanz irgendwo im Code erzeugt, wodurch der EventHandler überschrieben wurde.

Ich verarbeite meine Daten nun nicht direkt aus dem DataSet heraus, sondern nehme jeweils den Inhalt aus den DGV Zellen und weise diese meiner Instanz zu. Wird so bestimmt nicht gemacht :-/


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
            foreach (DataGridViewRow row in dataGridView.SelectedRows)
            {
                id = row.Cells[0].Value.ToString();
                vorname= new Uri(row.Cells[1]);
                nachname= row.Cells[2];
                password = row.Cells[3];
                Person person = new Person(id, vorname, nachname, password);
                person.PropertyChanged +=RefreshDataGridView;

                    switch (sender.ToString())
                    {
                        case "Start": ThreadPool.QueueUserWorkItem(delegate { person .Start(); }); break;
                        case "Stop": ThreadPool.QueueUserWorkItem(delegate { person .Stop(); }); break;
                    }
            }


Jetzt wollte ich wissen, ob man denn eine bestimmte Zelle im DGV an eine Property meiner Person binden kann?


Ralf Jansen - Fr 03.02.12 16:56

Eine Row ein Object. Also wenn du eine Liste von Person bindest würde jede Property der Person dann eine Zelle im Grid darstellen.

Oder soll deine Frage implizieren das du die Daten einer Row aus verschiedenen Objekten zusammensetzen willst? Dann ist die Antwort nein. Einfach so gibt Databinding das nicht her.