Autor Beitrag
Talemantros
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Di 23.12.14 17:58 
Hallo,
ich hätte da mal wieder einen.

Ich habe ein DataGridView an dem über eine BindingSource Daten hängen.
Nun möchte ich dem User die Möglichkeit geben, über einen Button Zeilen zu löschen und über einen Doppelklick im DGV.

Daher macht es ja Sinn nur einmal den Quellcode zu schreiben:

ausblenden C#-Quelltext
1:
2:
3:
4:
            if (bsListPFlow.Current != null)
            {
                bsListPFlow.RemoveAt((int)dgvProcessStep.Rows[e.RowIndex].Index);
            }


Wie müsste ich dies mit der Methode machen, dass ich auf e.RowIndex zugreifen kann und die Methode auch einem Burron zuordnen kann?

Wenn ich das ganze umhülle mit

ausblenden C#-Quelltext
1:
2:
3:
4:
        private void test(object sender, DataGridViewCellEventArgs e)
        {

        }


kann ich dies zwar über das EigenschaftenFenster dem DGV zuordnen, aber nicht dem Button.

Vielen Dank

Gruß

Daniel

P.S.: Schöne Feiertage
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Do 25.12.14 15:56 
Schreibe doch einfach eine Methode, die das tut, was du willst und beim Aufruf im Event gibst du alle Daten (wie z.B. e.RowIndex) der Methode mit.
Wo du dann den jeweiligen Index her bekommst, weißt du vermutlich selber am besten. Bei dem Event aus dem DGV ist das ja kein Problem, beim Button musst du vermutlich selber im View nachschauen und den SelectedIndex suchen. Über Binding geht das bestimmt auch, aber das ist (bei WPF) glaube ich so nicht direkt mit vorhanden.
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Do 25.12.14 19:20 
Man muß sich natürlich noch de Frage stellen, ob das Verschieben eines einzelnen RemoveAt-Aufrufs eine eigene Funktion wert ist ;)

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Fr 26.12.14 00:17 
Wenn ein paar Zeilen Code mehrfach in genau der selben Form wieder verwendet werden, würde ich dafür eine eigene Methode schreiben. Mit einem klug gewählten Namen ist das auch keine Beeinträchtigung für die Übersichtlichkeit, sondern eher ein Gewinn.

Wer es ganz genau wissen will, kann mit der Performance argumentieren, aber die Unterschiede sind so gering, dass das gerade bei der GUI nicht auf fällt.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mo 29.12.14 16:10 
Ok,
danke schonmal.

Es hängt gerade wieder an einer Kleinigkeit.
Die Eigenschaft SelectedIndex gibt es so nicht.

Wie lese ich den die erste Spalte einer markierten Zeile aus. (kein Multiselect möglich)


Danke

Gruß
Daniel
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 29.12.14 16:28 
Wo ist der Zusammenhang zur Ursprungsfrage? Wenn es immer noch ums löschen geht, lösch einfach dieses Objekt fertig aus.
ausblenden C#-Quelltext
1:
BindingSource.Remove(BindingSource.Current);					


Zitat:
Wie lese ich den die erste Spalte einer markierten Zeile aus. (kein Multiselect möglich)


Du hast das markierte Objekt (z.B. über BindingSource.Current) ließ einfach die Property die der gewünschten Spalte entspricht aus. Was hat das mit/ohne Multiselect zu tun?
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mo 29.12.14 16:53 
Hallo Ralf,
das mit dem MulitSelect war bezogen auf viele Google Posts die ich durchstöbert habe in der Hoffnung was zu finden, und diese immer Schleifen um die SelectedRows gemacht haben.

Danke für den Quelltext zum löschen über die BindigSource.

Da ich dafür nicht nochmal ein extra Post aufmachen möchte.
Wennich ein DataGrid hätte, das über die DataSource Eigenschaft mit einem DataTable gefüllt wäre.
Wie würde ich dann die erste Zelle der aktiven Zeile auslesen können?

Brauche das gerade und bekomme es einfach nicht hin.

Danke

Gruß
Daniel

Edit: Ich habe nun eine BindingSOurce dazwischen gebastelt und diese dem DataGrid zugewiesen

Für den Button zum Auslesen dann
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
        private void btnHistorie_Click(object sender, EventArgs e)
        {
            
            var myHistorie = new Historie();
            myHistorie.ArticleID = Convert.ToInt64(dgvUebersicht.Rows[bsUebersicht.Current].Cells[0].Value);
            myHistorie.Show();

        }


Jetzt bemängelt er bei bsUebersicht.current, dass eine Konvertierung von Objekt in in Int nicht möglich ist

Wenn ich dann folgendes dazu mache (int)

Dann geht es auch nicht. "Ungültige Umwandlung"
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 29.12.14 17:31 
Zitat:
Jetzt bemängelt er bei bsUebersicht.current, dass eine Konvertierung von Objekt in in Int nicht möglich ist

Wenn ich dann folgendes dazu mache (int)

Dann geht es auch nicht. "Ungültige Umwandlung"


Ich gehe mal schwer davon aus das du gar keine Int's in der BindingSource verwaltest. Denke nochmal scharf nach was für Objekte du in die BindingSource gepackt hast.


Zitat:
ausblenden C#-Quelltext
1:
myHistorie.ArticleID = Convert.ToInt64(dgvUebersicht.Rows[bsUebersicht.Current].Cells[0].Value);					


Warum so kompliziert?

ausblenden C#-Quelltext
1:
myHistorie.ArticleID = ((DerTypDerInBindingSourceSteckt)bsUebersicht.Current).ArticleID;					
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mo 29.12.14 17:38 
Hallo Ralf,
du hast recht.
Ich habe in der BindingSource/DataTable keine ints.

Aber er bemängelt ja auch nicht meinen Inhalt sondern dgvUebersicht.Rows[bsUebersicht.Current]. indem er sagt. dass er aus Current nicht für Rows verwenden kann.

Dann hätte ich noch eine Frage, die zum Ausgang dieses EIntrags passt.
Wenn ich 3 Comboboxen habe bei deren Verwendung immer dieselbe Methode verwendet werden soll, kann ich diese im Eigenschaften Fenster der Combobox nicht anwählen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
        
private void Suche()
        {

        }


würde ich gern zuweisen zu der Eigenschaft : SelectionChangeCommitted zuweisen.
Dies geht aber in dem Dropdown nicht.

Muss ich dann tatsächlich die Methode erstellen und Suche() aufrufen?
Oder geht dies noch anders?

Edit: Unsere Antworten haben sich überschnitten. Article ID ist eine Property eines anderen Form, welche ich versuche mit dem Inhalt der ersten Spalte einer Übersicht zu füllen um die Ihstorie zu diesem Article anzeigen zu lassen
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 29.12.14 17:44 
SelectionChangeCommitted erfordert eine bestimmte Signatur (vermutlich object sender, EventArgs e) die musst du schon erfüllen. Aber auch diese Methode musst du dann nur einmal erstellen. Suche() hört sich nach einen UI unabhängigen Ding an insofern wäre es richtig den EventHandler (UI nah) zu haben der Suche aufruft (was allgemeines). Die Suche Methode wäre dann aber auch nicht Teil der Form sondern gehört wo anders hin da was allgemeines.

Zitat:
Article ID ist eine Property eines anderen Form, welche ich versuche mit dem Inhalt der ersten Spalte einer Übersicht zu füllen um die Ihstorie zu diesem Article anzeigen zu lassen


Häh? Egal woher die kommt und wo die hin geht. In der ersten Spalte steht eine Property des an das Grid gebundenen Objektes und die solltest du einfach benutzen.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mo 29.12.14 18:08 
Hallo Ralf,

ich fülle über diesen Code

ausblenden 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:
        public static DataTable GetDataTableAllArticle()
        {
            strSQl = "Select bestand.warenid, kunde.firmenname, kundeunit.unit, kundetp.tp, schrottart.schrottart, "
                    + "bestand.chargenbereich, behaelter.bezeichnung, behaelterohne.bezeichnung,  bestand.behaelternummer, " 
                    + "bestand.behaelternummeraktuell, bestand.bgewicht, bestand.ngewicht, lagerplatz.nummer, bestand.ezeit, " 
                    + "mitarbeiter.benutzername, pschritte.bezeichnung, bestand.farbe from bestand "

                    + "join kunde on kunde.kundeid=bestand.kundeid "
                    + "join kundeunit on kundeunit.kundeunitid=bestand.kundeunitid "
                    + "join kundetp on kundetp.kundetpid=bestand.kundetpid "
                    + "join schrottart on schrottart.schrottartid=bestand.schrottartid " 
                    + "join behaelter on behaelter.behaelterid=bestand.behaelterid "
                    + "join mitarbeiter on mitarbeiter.mitarbeiterid=bestand.mitarbeiterid "
                    + "join lagerplatz on lagerplatz.lagerplatzid=bestand.lagerplatzid "
                    + "join behaelterohne on behaelterohne.behaelterohneid=bestand.behaelterohneid "
                    + "join pablaufschritte on pablaufschritte.pablaufschritteid=bestand.pablaufschritteid "
                    + "join pschritte on pschritte.pschritteid=pablaufschritte.pschritteid ";

            DataTable dt = new DataTable();

            using (MySqlConnection conn = new MySqlConnection(connStr))
            {
                using (MySqlDataAdapter da = new MySqlDataAdapter(strSQl, conn))
                {
                    da.Fill(dt);
                }
            }

            return dt;
        }

das Datatable, welches an die BindigSource gepackt wird und dann an das DataGridView

In der ersten Spalte steht eine eindeutige ID, des Typs Long

Wenn ich aber versuche mit deinem Code

ausblenden C#-Quelltext
1:
((long)bsUebersicht.Current).					


bekomme ich nicht die Möglichkeiten auf die einzelnen Spalten zuzugreifen?!
Siehe Bild

Danke für die Erklärung der Funktion Suche.

Gruß
Daniel
Einloggen, um Attachments anzusehen!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 29.12.14 18:28 
ausblenden C#-Quelltext
1:
var articleID = (long)((DataRowView)bsUebersicht.Current).Row["warenid"];					


Stell dich darauf ein das du dir bei untypisierten DataTables ständig einen Wolf casten must. Wenn du mit den Daten arbeiten willst und nicht einfach nur anzeigen lass das mit den DataTables das macht nur Schwierigkeiten. Sollte warenid wirklich articleId entsprechen gehört der Designer natürlich mal wieder geschlagen.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mo 29.12.14 21:53 
Danke für die Erläuterung/Hilfe.

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden C#-Quelltext
1:
var articleID = (long)((DataRowView)bsUebersicht.Current).Row["warenid"];					


Sollte warenid wirklich articleId entsprechen gehört der Designer natürlich mal wieder geschlagen.


Den Schlag habe ich erhalten und akzeptiert. 😄

Vermutlich wäre es nicht nur damit getan beides gleich zu nennen?!
Würdest du da noch was erläutern? Bin jalernwillig auch wenn ich manchmal zu langsam bin. 😣😣

Ich hätte eine Ausrede : Als ehemaliger TourSecurity darf ich ein wenig langsamer sein. Immerhin denken eh viele wir wären doof 😃😃

Danke
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 29.12.14 22:54 
Zitat:
Vermutlich wäre es nicht nur damit getan beides gleich zu nennen?!


Kommt jetzt ein wenig auf den dahinterstehend Aufwand an. Wenn du auf der grünen Wiese anfangs dann solltest du einfach immer konsequent gleiches immer gleich benennen. Es hört sich für viele Entwickler nach unnötigem Aufwand an aber bevor man ein neues Projekt anfängt ist es eine gute Idee ein Wörterbuch der zu benutzenden Begrifflichkeiten anzulegen mit entsprechenden Benennungsregeln (wie benenne ich Typen, via Variablen dieser Typen, wie Listen von diesen Typen etc.)

Bei einem Brownfield Projekt ist das natürlich schwerer und ich würde davon abraten Alt Begriffe durch neue ersetzen zu wollen auch wenn der Alt Begriff doof, falsch, überholt oder sonstwas ist. Die Wahrscheinlichkeit das man das komplett schafft geht üblicherweise gegen null und man landet dann dummerweise einfach nur in einem System wo das gleiche mehrere Namen hat und die Menge an totem nicht hilfreichen Wissen das aber jeder Beteiligte kennen muss in einem Projekt sinnlos vergrößert.

Wenn z.B hier der Begriff warenid nicht änderbar ist da in der Datenbank verdrahtet ist und schon anderer Software diese verwenden dann benutzt in einfach weiter. Das ist mittelfristig besser auch wenn denn vielleicht niemand mehr verwendet(z.B. auch die Benutzer der Software sprechen von Artikeln) außer die Softwareentwickler. Bei einen eindeutigen Begriff tut man sich wesentlich leichter denn an einer Stelle zu definieren und zu erklären und beim Programmieren weiß man ohne nachzudenken was zusammengehört. Zumindest solange bis man aufhört schlecht benamsten Code zu vertrauen weil er einen scheinbar ständig belügt und man sich gezwungen fühlt jeden Codezweig immer wieder bis zum Ende zu verfolgen um sich davon zu überzeugen das der auch wirklich das tut was er anhand seiner Begriffe vorgibt zu tun.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mi 31.12.14 15:00 
Vielen Dank