none
DataGridView中的Checkbox column在TabControl顯示的問題 RRS feed

  • 問題

  • 小弟使用的是VS 2008

    在使用者介面上有一個TabControl,裡面有TabPage1及TabPage2。

    TabPage2中有一個DataGridView。

    在TabControl外有一個按鈕。

    在程式執行後,按下按鈕,在DataGridView中新增二個string Column及一個Checkbox column,並將Checkbox的所有Cell設為ture (即在畫面上顯示為已勾選)

    問題為,若程式執行後直接按下按鈕,再進入TabPage2,會看見DataGridView中,前兩個string Column內容正確,但Checkbox卻未被設定 (保持未勾選狀態)

    若程式執行後,先進入TabPage2,再按下按鈕,則所有內容皆正確顯示

    搜尋了一陣子,發現類似的討論

    http://social.msdn.microsoft.com/forums/en-us/winformsdatacontrols/thread/32779A00-9E98-45AB-A571-4A534D40491B

    裡面提到DataGridView只有在visible時才會更新,但我的測試是文字欄位能更新,Checkbox欄位無法更新

    設定文字顏色等屬性時,有時也沒有效果,不知道是否有較好的解決方式

     

    還請各位先進指教

     

     

    2010年11月12日 上午 10:18

所有回覆

  • 換一個做法試試, 不要直接操作DataGridView.

    而是改成 DataGridView的DataSource是BindingSource

    而BindingSource的來源是DataTable.

    嘗試用改變DataTable的方式來改變DataGridView.

    至於顏色那些東西,  可能要藉由某些和Paint有關的事件來處理了.

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年11月12日 上午 10:31
    版主
  • 是這篇說的情況嗎?

    http://tlcheng.wordpress.com/2007/11/01/vb2005-listview-%e5%88%9d%e5%a7%8b%e5%8c%96%e8%88%87-itemchecked-%e4%ba%8b%e4%bb%b6/


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年11月12日 下午 03:25
  • 有關Bill Chung兄所提的方法,小弟測試後,似乎沒有效果

    以下是小弟的測試:

          DataTable myTable = (DataTable)dataGridView1.DataSource;
    
          for (int i = 0; i < myTable.Rows.Count; i++)
          {
            DataRow dr = myTable.Rows[i];
            dr.BeginEdit();
            dr[0] = true;
            dr.EndEdit();
          }
    
          dataGridView1.DataSource = myTable;
    

    測試的結果,若在dataGridView出現前做這個動作,那checkbox的內容仍然沒有被更改,

    若dataGridView已出現,則改變會生效。

    另外要提的提,前面提到的visible,似乎不是指將dataGridView.visible設為true,而是dataGridView必須出現在畫面上,才能讓update生效

    再參考心冷兄提供的資料,感覺這個現象是因為datGridView要出現在畫面上,才會觸發事件,讓this得到他的handle,

    但資料中使用的是VB.net..

    With nowListView
    
    …[略]
    
       pListView = .Handle
    
       .ResumeLayout(True)
    
       .PerformLayout()
    
       AddHandler .ItemChecked, eh
    
    End With 
    

    因為不知道pListView = .Handle及AddHandler .ItemChecked, eh是什麼意思,所以無法測試

    其實一開始看到和visible有關時,小弟就想到在程式初始化時,先讓有dataGridView的地方都出來露個臉,以這個例子來說,便是程式一開始先跳到TabPage2再回到TabPage1,試過之後,這樣是可以動作的...

    如果可以的話,希望能請教一下,在心冷大的資料最後所提到的「讓事件在強制取得控制項 Handle 之後才設定」,是怎麼做的

     

    <abbr class="affil" />
    2010年11月13日 上午 11:29
  • 看起來,那篇拉哩拉雜的講一堆,重點沒有很清楚點出來,據我的了解,應該是要這樣說:

    .Net 控制項在完整建立前,你有很多東西不能做,所以若你的程式碼在 Form_Load 或相關控制項尚未完整建立前就要操控時,先讀取

    控制項.Handle

    當你要讀取 控制項.Handle 屬性時,控制項會被強迫立即建立,你隨後的程式碼才能真的完成對應的屬性設定,否則控制項將會在你用程式碼將屬性設完後才建立,就會發生該勾選沒勾選的情形。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年11月13日 下午 03:35
  • 小弟再做了一下測試,在dataGridView加入DataGridViewCheckBoxColumn後,加入以下語法,下面是dataGridView的初始化動作:


          DataTable dt = new DataTable();   
    
          dt.Columns.Add("燈號");
          dt.Columns.Add("狀態");
          DataRow dr = dt.NewRow();
          
          for (int i = 8; i >=1 ; i--)
          {
            dr = dt.NewRow();
            dr[0] = "Field1"
            dr[1] = "Field2"
            dt.Rows.Add(dr);
          }
    
          dataGridView1.DataSource = dt;
     
          DataGridViewCheckBoxColumn myChkColumhn = new DataGridViewCheckBoxColumn();
          myChkColumhn.HeaderText = "顯示";
          dataGridView1.Columns.Add(myChkColumhn);
    
          IntPtr myPtr = dataGridView1.Handle; //取得Handle
    

     

    動作結束後,dataGridView的所有欄位都已設定好,且讀取handle,但執行後仍然是同樣的問題,文字欄位部份的顯示正確,但更新CheckBoxColumn仍然無法完成,這是否表示,讀取dataGridView的handle時,並沒有讓CheckBoxColumn狀態更新,即dataGridView與CheckBoxColumn其實還沒有bind在一起?

    且若控制項尚未建立,嘗試存取應該會出現錯誤訊息才對,因此這個現象可能是元件內部處理的異常?

    目前看起來,要讓他動,還是暫時自己移tabPage好了@@

    2010年11月15日 上午 01:26
  • 當你要讀取 控制項.Handle 屬性時,控制項會被強迫立即建立,你隨後的程式碼才能真的完成對應的屬性設定,否則控制項將會在你用程式碼將屬性設完後才建立,就會發生該勾選沒勾選的情形。

    從這段說法來看,Handle 應該用在最前面吧?

     

    Handle 的使用是針對剛載入時的情形,如果你的程式是在完成畫面顯示後才變更控制項,是不需要使用到 Handle ,除非你需要呼叫 API 。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年11月15日 下午 12:23
  • 按照您的說法,將handle移到最前後,仍然是一樣的結果,且在小弟先前的做法中,讀取handle時其實還沒有變更checkBoxColumn的值,是取完之後才在其它地方做變更的,因此讀取handle的作法,在這裡似乎沒有預期的效果

     

    若將讀取handle移到最前,此時dataGridView中的Column全部尚未建立,不知效果是否有影響。

    這裡主要的問題是,只有checkBoxColumn會有這種問題;普通的文字欄位不論有沒有取handle或改變visible,都能正常動作,其它種類的Column小弟沒試過,因此不清楚情況。

    有關「讀取 控制項.Handle 屬性時,控制項會被強迫立即建立」,若是從工具箱拖拉的元件出現在Form上時,會有什麼情況使這個元件尚未建立嗎?或者是因為在上面的測試裡,checkBoxColumn是在dataGridView與source bind完後才插入的關係,可能還須要再測試一下。

     

    感謝您的指導

     

     


    zeus
    2010年11月16日 上午 01:18