Button zu DataGridView hinzufügen
-
Hallo,
nochmals ein Problem:
Zum DataGridView soll eine Spalte mit einem Button eingefügt werden:
private void AddButtonLieferscheine(DataGridView dg) { for (int i = 0; i < dg.Rows.Count; i++) { btnEdit = new DataGridViewButtonColumn(); btnEdit.Name = "btnBearbeiten"; btnEdit.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; btnEdit.FlatStyle = FlatStyle.Standard; btnEdit.CellTemplate.Style.BackColor = Color.LightGray; btnEdit.Text = "Edit"; btnEdit.HeaderText = "Aktion"; } dg.Columns.Insert(18, btnEdit); }
Nun dachte ich, dass ich den Button an Position/Index 18 gesetzt habe.
Möchte ich nun aber den Button Klicken, dann ist der ColumnIndex = 0.
Weshalb?Und rufe ich die gesamte Funktion nochmals auf, dann ist der Index der Button Columns = 18. Warum jetzt?
Der erneute Aufruf sieht so aus:dgLieferscheine.DataSource = null; dgLieferscheine.Rows.Clear(); dgLieferscheine.Columns.Clear(); dgLieferscheine.DataSource = DB.GetBestellDaten(Convert.ToInt32(dgLieferscheine[16, e.RowIndex].Value)); SetupGrid(); AddButtonToGrid(dgLieferscheine);
Insagesamt habe ich eben 17 Datenspalten, wovon aber nicht alle angezeigt werden.
-
Deine ganze Methode ist murks.
Füge am Anfang die Spalte ein. Du erstellst momentan n-Instanzen einer DataGridViewButtonColumn und fügst dann die letzte erstellte deinem Grid hinzu.
Das der ColumnIndex = 0 ist, liegt daran, das dein DataGridView zu dem Zeitpunkt wahrscheinlich noch keine Spalten hat, sondern du erst dannach Daten bindest.
-
Hmm, ok ...
Hab es nun so versucht zu lösen:
dgLieferscheine.DataSource = null; dgLieferscheine.Rows.Clear(); dgLieferscheine.Columns.Clear(); dgLieferscheine.DataSource = DB.GetBestellDaten(Convert.ToInt32(dgLieferscheine[16, e.RowIndex].Value)); SetupGrid(); DataGridViewButtonColumn bnCol = new DataGridViewButtonColumn(); bnCol.Text = "Löschen"; bnCol.UseColumnTextForButtonValue = true; dgLieferscheine.Columns.Insert(10, bnCol);
Immer noch Murks?? Bzw. wenn ja, was genau ist Murks ...
Und weshalb kann ich immer noch nicht über den Index = 10 zugreifen??
-
Wie viele Spalten hat dein Grid?
Ich habe jetzt ein Testprogramm erstellt, welches 2 Spalten + die Löschspalte hat. Nach dem Insert an Index 2 (da der Startindex 0 ist) wird auch der korrekte Index ausgewertet.
-
Insgesamt habe ich 10 Datenspalten (Index 0-9) und die Löschenspalte mit Index 10.
Die Spalte mit dem Button wird auch richtig ans Ende gesetzt, aber beim Klick auf den Button hat dieser dann den Index = 0.Wenn eine Zeile gelöscht wird, führe ich die selben Anweisungen wie zu Beginn aus.
Dann hat der Button auch den Index 10. Nur ben zu Beginn nicht.Und das Ereignis so zu prüfen wäre wohl eine unsaubere Lösung
if (e.ColumnIndex == 0 | e.ColumnIndex == 10) {...}
-
Wie prüfst du, welchen Index die Spalte hat? Ich habs mit CellContentClick gemacht. Aber auch wenn ich mir direkt nach dem Hinzufügen den Index ausgeben lasse, stimmt dieser. Vielleicht machst du aber auch etwas anderes.
-
Ich lasse mir den ColumnIndex über eine MessageBox beim Klicken des Grids ausgeben.
Kann es evtl. daran liegen, dass ich zunächst die Daten aus der Datenbank als DataSource anbinde?!
Wobei ich dies ja genau gleich nach dem Löschen einer Zeile so durchführe und da alles korrekt ist.
-
Mit der Datenbindung an sich wird das Problem nicht zusammen hängen. - Wichtig ist das der Index der Spalte erst nach dem Binden der Daten geändert wird und das hat sollte wie gesagt funktionieren.
Mein Testcode ist:
DataTable dtTest = new DataTable(); dtTest.Columns.Add("ID", typeof(Int32)); dtTest.Columns.Add("Name", typeof(string)); for(int i = 0; i < 10; i++) dtTest.Rows.Add(new object[] { i+1, "Test" + i.ToString() }); this.dataGridView1.DataSource = dtTest; DataGridViewButtonColumn bnCol = new DataGridViewButtonColumn(); bnCol.Text = "Löschen"; bnCol.UseColumnTextForButtonValue = true; this.dataGridView1.Columns.Insert(2, bnCol);
-
Ganz komisch ... nun dachte ich, alles läuft prima und plötzlich geht es nicht mehr.
Ich führe (an 2 unterschiedlichen Stellen) exakt die selbe Abfrage aus, nur die GridView ist eine andere.Einmal klappt es prima, der ColumnIndex beim Klick des Button ist 5 und beim anderen Aufruf ist dieser 0.
Weshalb??
private void InitLieferschein(DataGridView dg) { dg.DataSource = null; dg.Columns.Clear(); DataTable table = DB.GetBestelldaten(); dg.DataSource = table; // Button hinzufügen. DataGridViewButtonColumn bnAuswahl = new DataGridViewButtonColumn(); bnAuswahl.HeaderText = "Speichern"; bnAuswahl.Text = "Ok"; bnAuswahl.UseColumnTextForButtonValue = true; dg.Columns.Insert(5, bnAuswahl); }
-
Ich tippe immernoch, das es 0 ist, weil keine Datenquelle zugewiesen ist. - Aber du behauptest ja, das dies immer vor der Abfrage der Fall ist.
-
Nun klappt es! Danke!
-
Und, magst uns auch aufklären, woran es hakte?
-
ICh kann es leider nicht erklären, weshalb es geklappt hat
Stehe nun wieder vor dem selben Problem???
Ich tippe immernoch, das es 0 ist, weil keine Datenquelle zugewiesen ist. - Aber du behauptest ja, das dies immer vor der Abfrage der Fall ist.
Wie kann ich das prüfen??
Laut der Reihenfolge in meinem Code sollte das doch der Fall sein, oder nicht?
void GetData() { dataGridView1.DataSource = null; dataGridView1.Rows.Clear(); dataGridView1.Columns.Clear(); DataTable table = DB.GetNumberPrefix(); this.dataGridView1.DataSource = table; AddButton(); } void AddButton() { DataGridViewButtonColumn bnCol = new DataGridViewButtonColumn(); bnCol.Text = "Speichern"; bnCol.UseColumnTextForButtonValue = true; this.dataGridView1.Columns.Insert(5, bnCol); dataGridView1.CellClick += new DataGridViewCellEventHandler(ddataGridView1_CellClick); }
Entschuldige, aber ich verstehe es wirklich nicht
-
Nach deiner Codereihenfolge sollte die Spalte natürlich an der richtigen Position sein, wenn du sie in der 6. Spalte haben möchtest.
Allerdings frage ich mich, warum es nun plötzlich nicht mehr funktionieren soll, wenn es zuvor funktioniert hat. Was hast du denn in der Zwischenzeit geändert?
-
Die Spalte ist an der richtigen Position, nur der ColumnIndex ist 0
Geändert: Eine neue Funktion und eine andere DataGridView
-
-
Hast du wirklich mit der Buttonspalte 6 Spalten?
-> Wenn ja sieht es für mich aus, als wenn nur der DisplayIndex gesetzt wird.
-> Wenn nein, nutze den richtigen Index. Denn dieser ist 0-basiert. -
Wird nur der DisplayIndex gesetzt, musst du den ColumnIndex manuell anpassen.
-
-
inflames2k schrieb:
-
Hast du wirklich mit der Buttonspalte 6 Spalten?
-> Wenn ja sieht es für mich aus, als wenn nur der DisplayIndex gesetzt wird.
-> Wenn nein, nutze den richtigen Index. Denn dieser ist 0-basiert. -
Wird nur der DisplayIndex gesetzt, musst du den ColumnIndex manuell anpassen.
Ich dachte der ColumnIndex ist schreibgeschützt ...somit kann ich diesen doch nicht ändern/anpassen?
-
-
Ist er auch, weiß gerade nicht mehr wie, aber irgendwie hat ich den auch schon umgebogen.
Aber was mir gerade einfällt, ist der ColumnIndex für dich wirklich überlebensrelevant? - Ansonsten würde ich die Spalte nämlich mit einem Namen versehen und bei Prüfungen immer über den Namen zugreifen.
-
Danke für den Tipp!!
So klappt es super