0

次のコードを使用して、データグリッドビューにリストの内容を表示しようとしています。

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

backgroundWorker のリストにデータを追加しています。ListBindingListに変更すると、次のエラーが表示されます

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

ただし、リストを使用すると、データグリッドが表示されたときに 3 番目の列が表示されます。これには、カテゴリの各エントリの文字列の長さのみが含まれます。

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

でリストを渡すことができます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 に答える