0

我正在尝试使用以下代码在 datagridview 中显示列表的内容。

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

我正在将我的数据添加到 backgroundWorker 的列表中。如果我将List更改为BindingList,我会收到一条错误消息

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

但是,如果我使用列表,当显示数据网格时,我会得到第三列,它只包含类别中每个条目的字符串长度。

有谁知道在使用 BackgroundWorker 时如何让数据网格显示字符串内容而不是字符串长度?


    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;
    }
4

4 回答 4

1

请创建一个委托并调用委托使用control.Invoke

您可以像这样使用调用:

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

更多关于后台工作者

祝你好运!

于 2013-04-22T13:35:55.340 回答
1

您可以使用BackgroundWorker.ReportProgress. 我允许传递进度和自定义对象(MSDN 上的全牙列)。处理此事件是 UI 线程,因此它是正确的。

如果你最后需要这个,只需使用 RunWorkerCompletedEventArgs.Result (在 MSDN 上再次定义

于 2013-04-22T13:34:18.477 回答
1

基于如何将 List<string> 绑定到 DataGridView 控件?

我创建了一个类

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

然后将列表更改为列表

我正在获取数据,但它出现在第 3 列中。我只假设有 2 列。

于 2013-04-22T13:49:43.000 回答
1

使用此代码。我也遇到了类似的问题,但使用 LinQ 对其进行了整理。

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

这里,

dataGridView1 :- ID of datagridview
于 2015-06-10T06:43:44.397 回答