2013-04-22 51 views
0

我想使用下面的代碼在datagridview中顯示列表的內容。如何將我的列表<string>綁定到datagridView?

List<string> data = new List<string>(); 
dataGridView1.DataSource = data; 

我將我的數據添加到backgroundWorker中的列表中。如果我改變列表的BindingList,我得到一個錯誤說

Cross-thread operation not valid: Control 'dataGridView1' accessed from a thread other than the thread it was created on. 

但是如果我使用List,我得到在DataGrid顯示它第三列只包含字符串爲每個legth進入類別。

有誰知道如何使用BackgroundWorker獲取datagrid以顯示字符串內容而不是字符串長度?


private void OnBackgroundWorkerDoWork(object sender, DoWorkEventArgs e) 
    {    
     importExcelFile();    
    } 

    private void importExcelFile() 
    { 
     // hard coded file name for testing. 
     TextFieldParser parser = new TextFieldParser(@"E:\\test.csv"); 
     parser.TextFieldType = FieldType.Delimited; 
     parser.SetDelimiters(","); 

     while (!parser.EndOfData) 
     { 
      //Processing row 
      string[] fields = parser.ReadFields(); 
      foreach (string field in fields) 
      { 
       //TODO: Process field 
       data.Add(field); 
      } 
     } 
     parser.Close(); 
    } 

    private void loadFileToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     backgroundWorker1.DoWork += OnBackgroundWorkerDoWork; 
     backgroundWorker1.RunWorkerAsync(); 
    } 

    private void OnBackgroundWorkerRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     dataGridView1.DataSource = data; 
    } 
+0

顯示你的代碼的其餘部分,特別是你的待辦事項工作方法以及如何將列表傳遞給BG工作人員 – DGibbs 2013-04-22 13:31:21

+0

在將數據分配給DataSource之前,您是否正在等待數據完成添加到列表中? – 2013-04-22 13:32:03

+0

已發佈代碼 – 2013-04-22 13:34:38

回答

1

您可以通過列表與BackgroundWorker.ReportProgress。我允許傳遞進度和自定義對象(full dentition on MSDN)。處理這個事件是UI線程,所以它會是正確的。

如果您需要在此結束,只需使用RunWorkerCompletedEventArgs.Result(again definition on MSDN

+0

沒有錯誤信息。我看不到在dataGridView中列出的數據。我看到字符串的長度(在本例中爲URL) – 2013-04-22 13:39:38

1

請創建一個委託並調用使用control.Invoke

您可以使用調用這樣的委託:

private void AddToListBox(object oo) 
{ 
    Invoke(new MethodInvoker(delegate { listBox.Items.Add(oo); })); 
} 

更多關於Background Worker

祝你好運!

+0

沒有錯誤消息。我看不到在dataGridView中列出的數據。我看到字符串的長度(在這種情況下的URL) – 2013-04-22 13:40:44

+0

在UI線程中創建的控件不能以其他線程以正常方式訪問,所以你必須做我說的:) – Obama 2013-04-22 13:42:23

+0

是的,只有當我使用一個BindingList。我正在使用常規列表。我應該使用BindingList嗎?如果是這樣的話,它會有幫助嗎? – 2013-04-22 13:43:16

1

基於How to bind a List<string> to a DataGridView control?

我創建了一個類

public class StringValue 
{ 
    public StringValue(string s) 
    { 
     _value = s; 
    } 
    public string Value { get { return _value; } set { _value = value; } } 
    string _value; 
} 

則改爲清單列出

我得到的數據,但它出現在第3欄我只是想有2列。

1

使用此代碼。我也面臨着類似的問題,但使用LINQ整理出來..

IList<String> listObj = new List<String>(); 
dataGridView1.DataSource = listObj.Select(x => new { Value = x }).ToList(); 

這裏,

dataGridView1 :- ID of datagridview