2010-10-27 66 views
1

正如標題說的視野高度,滾動條會崩潰時,所有行的高度超過DataGridView的

DataGridview.ScrollBars =垂直;

假設DataGridview的願景可以包含4行,如果行到6,它有一個垂直滾動條。但是如果點擊ScrollBar,程序會崩潰。 如果我們設置DataGridview.ScrollBars = None,則不會發生問題。

public partial class visitorLeave : Form 
{ 
    public visitorLeave() 
    { 
     InitializeComponent(); 
    } 
    bool isWorkerStopped = false; 
    bool clickstart = false; 
    ManageEmployee me = null; 

    Thread tr1; 

    private void visitorLeave_Load(object sender, EventArgs e) 
    { 
     me = new ManageEmployee(10); 
     dataGridView1.AutoGenerateColumns = false; 
     dataGridView1.DataSource = me.DataSource; 
     tr1 = new Thread(new ThreadStart(Add)); 
     tr1.IsBackground = true; 
     tr1.Start(); 
    } 

    void Add() 
    { 
     while (!isWorkerStopped) 
     { 
      if (clickstart) 
      { 
       me.AddEmployee(new EmployeeData("new" + DateTime.Now.Ticks.ToString(), "0", "0", "0", "0", "0", null)); 
       dataGridView1.DataSource = me.DataSource; 
       dataGridView1.UpdateRowHeightInfo(0, true); 
       clickstart = false; 
      } 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     clickstart = !clickstart; 
    } 
} 

回答

1

這是Windows窗體的調試邏輯中的一個泄漏,它試圖以線程不安全的方式使用控件來檢測您。它看不到您在UI線程以外的線程中分配DataSource屬性。

使用BackgroundWorker來實現您的線程邏輯。並使用其RunworkerCompleted事件處理程序來設置網格的DataSource屬性。或者如果您希望保留現有的線程代碼,請使用Control.Invoke。

+0

但我仍然有一個問題:我想要一個程序(或一個線程)將數據添加到數據源,並且MainProgram更新datagridview。我怎麼做到的? – Michael 2010-10-27 12:40:53

+0

使用線程向列表<>添加數據沒有問題。但綁定到網格*必須*發生在主線程上。這不是問題,檢索數據是昂貴的,綁定不是。 – 2010-10-27 12:51:01