Autor |
Beitrag |
Talemantros
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: 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:
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
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
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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
Beiträge: 486
Erhaltene Danke: 99
Win7, Win81, Win10
Tokyo, VS2017
|
Verfasst: 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
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: 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
Beiträge: 4700
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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.
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
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: 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
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
Beiträge: 4700
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 29.12.14 17:31
|
|
Talemantros
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: 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.
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
Beiträge: 4700
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: Mo 29.12.14 18:08
Hallo Ralf,
ich fülle über diesen Code
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
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
Beiträge: 4700
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 29.12.14 18:28
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
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: Mo 29.12.14 21:53
Danke für die Erläuterung/Hilfe.
Ralf Jansen hat folgendes geschrieben : | 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
Beiträge: 4700
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: Mi 31.12.14 15:00
|
|