Programmgesteuert hinzufügen von Zellen und Zeilen im DataGridView
Bin ich zu kämpfen mit DataGridViewComboBoxCell
. Bei einigen Fällen (sagen wir mal, Ereignisse) muss ich vorwählen einen Wert von ComboBox
in meinem Formular DataGridView
. Wenn der Benutzer die änderungen einer box, ich bin in der Lage zu ändern, ein anderes Programm wie dieses:
var item = ItemName.Items.GetListItem(name);
if (item != null)
{
_loading = true; //that's needed to come around another CellValueChanged events
itemView.Rows[e.RowIndex].Cells["ItemName"].Value = item;
_loading = false;
}
Bin ich Auffüllen ItemName.Items
wie diese:
foreach (var item in _model.DefaultData.ItemList)
{
if (item.Value.Code.HasValue()) ItemCode.Items.Add(new ListItem(item.Key, item.Value.Code));
ItemName.Items.Add(new ListItem(item.Key, item.Value.Name));
}
GetListItem Methode:
public static ListItem GetListItem(this DataGridViewComboBoxCell.ObjectCollection col, string name)
{
ListItem retItem = null;
foreach (ListItem item in col)
{
if (item.Name == name) { retItem = item; break; }
}
return retItem;
}
Das funktioniert, ABER...
Nun möchte ich Zeilen hinzufügen DataGridView
laden der form wie:
foreach (var item in _model.SelectedItems)
{
var row = new DataGridViewRow();
row.Cells.Add(new DataGridViewTextBoxCell { Value = item.Id });
row.Cells.Add(new DataGridViewComboBoxCell { Value = ItemCode.Items.GetListItem(item.Code) });
row.Cells.Add(new DataGridViewComboBoxCell { Value = ItemName.Items.GetListItem(item.Name) });
row.Cells.Add(new DataGridViewTextBoxCell { Value = item.Units });
...
itemView.Rows.Add(row);
}
und wirft geliebten DataGridViewComboBox value is not valid
Ausnahme. Bitte helfen, ich bin aus Gedanken auf. Ich möchte nicht DataSource
oder so ähnlich. ItemCode
und ItemName
Spalte Elemente sind aufgefüllt und ordnungsgemäß zurückgegeben wird, durch GetListItem()
. Ich verstehe nicht, warum es normal funktioniert, aber auf dem Formular laden, es funktioniert nicht (auf gezeigt, funktioniert es ebenfalls nicht).
EDIT: sorry, vergessen hinzu zu fügen.
Meine ListItem-Klasse:
public class ListItem
{
public int Id { get; set; }
public string Name { get; set; }
public ListItem(int sid, string sname)
{
Id = sid;
Name = sname;
}
public override string ToString()
{
return Name;
}
}
Ich bereits, dass auch bei form-load:
ItemName.ValueMember = "Id";
ItemName.DisplayMember = "Name";
ItemCode.ValueMember = "Id";
ItemCode.DisplayMember = "Name";
ComboBox
wissen, die Elemente zu markieren, wenn Sie diese nicht setzen? Es wird kennen nur die aktuell ausgewählte Wert. Auch, stellen Sie sicher, dass Ihr manuell hinzugefügte Zellen werden in der entsprechenden Reihenfolge mit der DataGrid-Spalten.Ich fügen Sie Artikel zu
ComboBox
durch ItemName.Items.Add(...)
wo ItemName
ist ComboBox
. Wie ich schon sagte, es funktioniert, wenn ich die Werte ändern und auf grid-Zelle ändern, aber nicht, wenn ich Zeilen hinzufügen programmatisch auf laden.Naja, ich weiß nicht, was es bewirken kann. Sie haben geschrieben, eine Menge snippets, aber es ist schwierig, korrelieren Sie, und ich bin mir sicher, dass die Hälfte von Ihnen haben nichts mit dem problem zu tun. Versuchen Sie, erstellen Sie kurze Selbstversorger-Beispiel. Beginnen Sie mit dem neuen Projekt, dass nur noch datagrid mit combobox-Spalten, und fügen dummy-Elemente bei laden-Ereignis. Wenn es gelingt, gehören cellchanged-Ereignis. Erhöhen Sie den code inkrementell und testen für die Ausgabe, bis es erscheint in der kürzesten Selbstversorger-Beispiel. Dann wirst du entweder verstehen Sie das Problem oder zumindest sagen kann, anderen zu erlauben, es zu beheben.
Ok, ich werde versuchen mein bestes...
InformationsquelleAutor YOhan | 2014-08-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, ich habe es geschafft, zu lösen, es selbst.
Offenbar, es ist nicht genug für
DataGridViewComboBoxColumn.Items
enthalten Elemente möglich. Sie müssen auch hinzufügen, ElementeDataGridViewComboBoxCell.Items
wenn Sie hinzufügen eine neue Zeile programmatisch.Also, wenn jemand anderes versucht, meinen Ansatz nicht mit Datenbindungen wie
DataTable
etc., hier ist meine Lösung:InformationsquelleAutor YOhan
YourDataGridView.Spalten.AddRange(dgCol);
InformationsquelleAutor prampe
Hinweis: Die DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox, um die combo. Ich als "nichts", und...:
}
InformationsquelleAutor prampe