Discussion:
DataGridView mit spezieller Spalte
(zu alt für eine Antwort)
Karl M.
2007-11-09 22:42:33 UTC
Permalink
Hallo NG!

Ich versuche bei einer DataGridView eine neue Spalte anzulegen vom Typ
DataGridViewComboBoxCell. Das anlegen klappt auch, nur wenn ich das alles
zum laufen bringe, kommt mehrmals die Fehlermeldung:

DataGridView-Ausnahme:
System.ArgumentException: Der DataGridViewComboBoxCell-Wert ist ungültig.
Behandeln Sie das DataError-Ereignis, um dieses Standarddialogfeld zu
ersetzen.

Ich habe das Ganze auch mit numerischen Werten ausprobiert, doch kommt
dieselbe Fehlermeldung. Habe auch in einem weiteren Fall die
DataGridViewComboBox mit Werten gefüllt, doch auch da kommt dieselbe
Fehlermeldung.

Folgenden Code habe ich verwendet:

dataGridView1.ReadOnly = true;
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.Columns.Add("Spalte1", "Spalte1");
DataGridViewComboBoxCell Zelle1 = new
DataGridViewComboBoxCell();
DataGridViewColumn Spalte2 = new DataGridViewColumn(Zelle1);
Spalte2.Name = "Spalte2";
Spalte2.HeaderText = "Spalte2";
dataGridView1.Columns.Add(Spalte2);
dataGridView1.Rows.Add("Wert1", "Wert2");
dataGridView1.Rows.Add("Wert3", "Wert4");

Hat jemand eine Idee, wo der Fehler ist?

Vielen Dank im Voraus!

Mit freundlichen Grüßen
Frank Dzaebel
2007-11-10 07:24:57 UTC
Permalink
Hallo Karl,
Post by Karl M.
Ich versuche bei einer DataGridView eine neue Spalte anzulegen
vom Typ DataGridViewComboBoxCell. Das anlegen klappt auch, nur wenn ich
System.ArgumentException: Der DataGridViewComboBoxCell-Wert
ist ungültig. Behandeln Sie das DataError-Ereignis, um dieses
Standarddialogfeld zu ersetzen. [...] Hat jemand eine Idee, wo der Fehler
ist?
Damit die ComboBox einen anderen
Wert (ausser null) zulässt, solltest Du
noch deren DataSource oder die Items
setzen:

const int maxWert = 4;
//dataGridView1.ReadOnly = true;
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.Columns.Add("Spalte1", "Spalte1");

DataGridViewComboBoxColumn spalte2 = new
DataGridViewComboBoxColumn();
spalte2.Name = "Spalte2"; spalte2.HeaderText = "Spalte2";
DataTable dt = new DataTable();
dt.Columns.Add("Anzeige"); DataRow dr = dt.NewRow();
for (int i = 1; i <= maxWert; i++)
dt.Rows.Add("Wert" + i);
spalte2.DataSource = dt;
spalte2.DisplayMember = "Anzeige";
dataGridView1.Columns.Add(spalte2);

dataGridView1.Rows.Add("Wert1", "Wert2");
dataGridView1.Rows.Add("Wert3", "Wert4");


//=============================
// oder:

const int maxWert = 4;
//dataGridView1.ReadOnly = true;
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.Columns.Add("Spalte1", "Spalte1");
DataGridViewComboBoxColumn spalte2 = new
DataGridViewComboBoxColumn();
spalte2.Name = "Spalte2"; spalte2.HeaderText = "Spalte2";
for (int i = 1; i <= maxWert; i++)
spalte2.Items.Add("Wert" + i);
dataGridView1.Columns.Add(spalte2);
dataGridView1.Rows.Add("Wert1", "Wert2");
dataGridView1.Rows.Add("Wert3", "Wert4");


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Karl M.
2007-11-10 11:11:07 UTC
Permalink
Hallo Frank,

vielen Dank für deine 2 Beispiele.
Von der Anzeige stimmt jetzt soweit alles.

Ein weiteres Hindernis, welches sich gebildet hat, ist dass ich jetzt 3 mal
in der ComboBox klicken muss, dass sich die Liste mit den Werten öffnet.
Wenn ich die Eigenschaft
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
setze, dann muss ich nur noch 2 mal klicken. Kann es sein, dass dieser
Nebeneffekt von dem Aktivitätsstatus der ComboBox abhängt? D.h. erster Klick
= Zeilenaktivierung, zweiter Klick = Zellenaktivierung (nur wenn nicht
FullRowSelect), dritter Klick = ComboBox-Aktivierung?
Ist dieser Effekt bekannt? Gibt es Lösungen?

Mit freundlichen Grüßen
Frank Dzaebel
2007-11-10 12:24:37 UTC
Permalink
Hallo Karl,
Post by Karl M.
vielen Dank für deine 2 Beispiele.
Von der Anzeige stimmt jetzt soweit alles.
ok.
Post by Karl M.
Ein weiteres Hindernis, welches sich gebildet hat, ist dass ich jetzt 3
mal in der ComboBox klicken muss, dass sich die Liste mit den Werten
öffnet.
Dann ist meistens folgender Mode sinnvoll:
dgv.EditMode = DataGridViewEditMode.EditOnEnter;


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Karl M.
2007-11-10 12:45:11 UTC
Permalink
Hallo Frank,
Post by Frank Dzaebel
Post by Karl M.
Ein weiteres Hindernis, welches sich gebildet hat, ist dass ich jetzt 3
mal in der ComboBox klicken muss, dass sich die Liste mit den Werten
öffnet.
dgv.EditMode = DataGridViewEditMode.EditOnEnter;
Das ist es gewesen. Vielen herzlichen Dank.

Mit freundlichen Grüßen
Karl M.
2007-11-10 15:04:43 UTC
Permalink
Hallo Frank,

wenn ich in der Spalte, in der auch die ComboBox ist, eine ID ist, die
ComboBox aber die Werte anzeigt, die an die ID gekoppelt sind, wie gebe ich
der Grid dann bescheid, dass sie die ID auf den Wert translaten soll?
D.h.:

Zu translaten: (angezeigt wird ID, translated bzw. in der ComboBox markiert
soll sein der Wert)
ID Wert
4 WertA
6 WertB
22 WertC
Post by Frank Dzaebel
const int maxWert = 4;
//dataGridView1.ReadOnly = true;
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.Columns.Add("Spalte1", "Spalte1");
DataGridViewComboBoxColumn spalte2 = new
DataGridViewComboBoxColumn();
spalte2.Name = "Spalte2"; spalte2.HeaderText = "Spalte2";
DataTable dt = new DataTable();
dt.Columns.Add("Anzeige"); DataRow dr = dt.NewRow();
for (int i = 1; i <= maxWert; i++)
dt.Rows.Add("Wert" + i);
spalte2.DataSource = dt;
spalte2.DisplayMember = "Anzeige";
dataGridView1.Columns.Add(spalte2);
dataGridView1.Rows.Add("Wert1", "Wert2");
dataGridView1.Rows.Add("Wert3", "Wert4");
Mit freundlichen Grüßen
Frank Dzaebel
2007-11-10 16:12:06 UTC
Permalink
Hallo Karl,
Post by Karl M.
wenn ich in der Spalte, in der auch die ComboBox ist,
eine ID ist, die ComboBox aber die Werte anzeigt,
die an die ID gekoppelt sind, wie gebe ich der Grid
dann bescheid, dass sie die ID auf den Wert translaten soll?
ID Wert
4 WertA
6 WertB
22 WertC
Dann zum Beispiel:

dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.Columns.Add("Spalte1", "Spalte1");
DataGridViewComboBoxColumn spalte2 = new
DataGridViewComboBoxColumn();
spalte2.Name = "Spalte2"; spalte2.HeaderText = "Spalte2";
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Anzeige");
dt.Rows.Add(4, "WertA"); dt.Rows.Add(6, "WertB");
dt.Rows.Add(22, "WertC"); spalte2.DataSource = dt;
spalte2.DisplayMember = "Anzeige";
spalte2.ValueMember = "ID";
dataGridView1.Columns.Add(spalte2);
dataGridView1.Rows.Add("Wert1", 4);
dataGridView1.Rows.Add("Wert3", 6);


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Karl M.
2007-11-10 17:02:47 UTC
Permalink
Hallo Frank
Post by Frank Dzaebel
spalte2.ValueMember = "ID";
Vielen Dank, das fehlte noch.

Mit freundlichen Grüßen

Loading...