Autor Beitrag
BlackMatrix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Di 31.01.12 22:24 
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:

ausblenden 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 ...
            }
        }


ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: BlackMatrix
BlackMatrix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Mi 01.02.12 00:30 
.....
BlackMatrix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: 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 :-/

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.