- PR -

DataGrid (System.Windows.Forms) のスクロールバーについて

1
投稿者投稿内容
Pluto
常連さん
会議室デビュー日: 2002/07/01
投稿数: 40
投稿日時: 2005-01-15 15:16
いつも御世話になります。

System.Windows.Form の DataGrid の DataSource (DataTable) に、
下記のように Thread を実行して新しい行を追加すると、
DataGrid の縦方向のスクロールバーが正常に表示できません。
(縦方向のスクロールバーが 2 つ表示されます)。

private System.Windows.Forms.Button button1;
private System.Windows.Forms.DataGrid dataGrid1;
private System.Data.DataTable dataTable1;

void Button1Click(object sender, System.EventArgs e)
{
  dataTable1 = new DataTable();
  dataTable1.Columns.Add();

  dataGrid1.DataSource = dataTable1;

  Thread thread1 = new Thread(new ThreadStart(ThreadProc));
  thread1.Start();
}

void ThreadProc()
{
  for (int i = 0; i < 20; i++) {
    DataRow dr = dataTable1.NewRow();
    dr[0] = i;
    dataTable1.Rows.Add(dr);
    Thread.Sleep(100);
  }
}


どなたかこの現象 (原因) をご存知の方、ご教示下さいますよう
宜しくお願い申し上げます。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-01-15 23:45
諸農です。

とりあえず、同じスレッド上で操作しないといけないようですので。。。

スレッドの開始前に一度datasourceからデータテーブルを外して、
スレッドの終了時に再度設定しなおすとか。

コード:
private DataTable dt = new DataTable("Test");
private void Form1_Load(object sender, System.EventArgs e)
{
    dt.Columns.Add("Col1",typeof(Int32));
    dataGrid1.DataSource = dt;
}

private void button1_Click(object sender, System.EventArgs e)
{
    dt.Rows.Clear();
    dataGrid1.DataSource = null;
    Thread th = new Thread(new ThreadStart(myThread));
    th.Start();
    th.Join();
    dataGrid1.DataSource = dt;
}

private void myThread()
{
    for (int i = 0; i < 200; i++) 
    {
        DataRow r = dt.NewRow(); 
        r["Col1"] = i; 
        dt.Rows.Add(r); 
        Thread.Sleep(10);
    }
}




または、非同期呼出で非同期処理が終了した時点で
コールバックメソッド内から呼び出すフォームコントロールの
メソッドであらためてデータソースにセットするとか。

コード:
private DataTable dt = new DataTable("Test");
private void Form1_Load(object sender, System.EventArgs e)
{
    dt.Columns.Add("Col1",typeof(Int32));
    dataGrid1.DataSource = dt;
}

private void button1_Click(object sender, System.EventArgs e)
{
    dt.Rows.Clear();
    dataGrid1.DataSource = null;
    MyDelegate md = new MyDelegate(myThread1);
    IAsyncResult ar = md.BeginInvoke(new AsyncCallback(myCallBack),md);
}

private delegate void MyDelegate();
private void myThread1()
{
    for (int i = 0; i < 200; i++) 
    {
        DataRow r = dt.NewRow(); 
        r["Col1"] = i; 
        dt.Rows.Add(r); 
        Thread.Sleep(10);
    }
}

private void myThread2()
{
    dataGrid1.DataSource = dt;
}

public void myCallBack(IAsyncResult ar) 
{
    MyDelegate md = (MyDelegate)ar.AsyncState;
    md.EndInvoke(ar);
    this.BeginInvoke(new MyDelegate(myThread2));
}




_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
1

スキルアップ/キャリアアップ(JOB@IT)