2012-02-18 161 views
0

我想將臨時數據放入通用列表並將其綁定到datagridview。
但是,我只能在datagridview中放置1行,我想像輸入數據庫一樣輸入多行。將臨時數據添加到列表並將其綁定到DataGridView Winform

這是我試過的,請告訴我如何解決它。謝謝:))

MyClass 
{ 
    private List<object> _list = new List<object>();; 

    public MyClass() 
    { 
    } 

    protected void OnClickButton(object sender, args e) 
    { 
    _list.Add(new { Name = textBoxName.Text, Gender = genderComboBox.Text }); 
    dataGridView1.DataSource = _list; 
    } 
} 

非常感謝!我真的很擔心這個問題。

+0

那麼,你只添加了1個項目的列表 - 你試過添加另一個? – Alex 2012-02-18 13:00:33

+0

@alex我只能添加一次。如果我再次單擊該按鈕,則什麼都不會發生,:/ – 2012-02-18 13:03:19

回答

2

您可以使用BindingList<object>而不是List<object>,例如, :

BindingList<object> bList = new BindingList<object>(); 

public MyClass() 
{ 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    bList.Add(new { Name = "Foo", Gender = "Bar" }); 
    dataGridView1.DataSource = bList; 
} 

與您的代碼的問題是,您要添加的元素_list,然後你通過名單,作爲網格的數據源。 第一次一切正常。下次它不起作用,因爲DataGridView.DataSource屬性在內部執行檢查,驗證傳遞的對象是否等於(或更好的引用等於)到當前,並且它什麼都不做。

BindingList<T>工作,因爲它暴露事件(由網格內部使用)報告列表被修改時,所以基本上你也可以避免每次除了第一個以外的時候傳遞給DataSource


作爲一個方面說明,我建議你使用特定的類(如圖@Alex answer),而不是放一個匿名類的object列表。

例如使用像Person自定義類,你可以傳遞一個空BindingList<Person>grid.DataSource然後添加其他Person對象沒有任何問題。

相反,您不能將空的BindingList<object>傳遞給grid.DataSource,因爲它導致無列網格,因此無法添加任何具有公共屬性的元素(因爲公共屬性轉換爲列)之後。因此,您需要傳遞至少一個定義了對象的BindingList<object>,以便網格可以理解列的內容並創建它們。

+0

非常感謝您先生解釋和回答我的問題。 :)) – 2012-02-18 13:50:55

+0

@rjtubera:不客氣。我剛剛添加了一個關於爲什麼自定義類優於匿名類的解釋,如果您有興趣。 – digEmAll 2012-02-18 16:06:03

0

使用ObservableCollection<T>,而不是名單

1

似乎DataGridView中總是需要,如果你用它自己的方式進行復位。

public class Person 
{ 
    public String Name { get; set; } 
    public String Gender { get; set; } 
} 

// Your control 
private List<Person> _persons = new List<Person>(); 

// Click Event 
dataGridView1.DataSource = null; 
_persons.Add(new Person() { Name = "Test", Gender = "Male" }); 
dataGridView1.DataSource = _persons; 

這將刷新當前數據在DataGridView在列表

使用BindingList<T>似乎是雖然適當的方式。 (感謝@digEmAll)

private BindingList<Person> _persons = new BindingList<Person>(); 

// Load Event 
dataGridView1.DataSource = _persons; 

private void button1_Click(object sender, EventArgs e) 
{ 
    _persons.Add(new Person() { Name = "Test", Gender = "Male" }); 
} 
相關問題