2013-04-22 48 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