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";
Was meinst du mit "ich will nicht von DataSource oder so ähnlich"? Wie würde der 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

Schreibe einen Kommentar