none
DataGridView 更新資料內容問題 RRS feed

  • 問題

  • 各位前輩好:

    我目前在一個表單上使用一個DataGridView (gvData), 還有一個按鈕, 按下後會更新gvData的資料跟欄位, 

    按鈕內的程式碼如下:
     private void button1_Click(object sender, EventArgs e)
     {
     try
     {
     gvData.Columns.Clear();
     gvData.Font = FormMain.fntStandardFont;
    
     clsStation Station = new clsStation();
    
     DataTable dt = Station.getDataSetByStationType(0).Tables[0];
    
     MessageBox.Show(dt.Rows.Count.ToString());
     //到此還可正常顯示取出的資料筆數
    
     DataGridViewTextBoxColumn myco0 = new DataGridViewTextBoxColumn();
     myco0.DataPropertyName = "cStationID";
     myco0.HeaderText = "序 號";
     myco0.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
     myco0.ReadOnly = true;
     myco0.SortMode = DataGridViewColumnSortMode.Automatic;
     gvData.Columns.Add(myco0);
    
     gvData.DataSource = dt;
    
     dt.DefaultView.AllowNew = false;
    
     dt.Dispose();
     }
     catch (Exception ex)
     {
     MessageBox.Show(ex.ToString());
     }
     }
    

    很奇怪的是我在本機的電腦上是可以正常執行更新,

    但是在另一台電腦上執行, 沒有例外錯誤出現, 但是表單呈現沒反應的狀態很像當機一樣, 必須用Ctrl+Alt+Delete才能強制把程式關閉@@"

    後來測試很多次一定得同時把以下程式碼註解掉, 才不會出現沒反應的狀態:

     //DataGridViewTextBoxColumn myco0 = new DataGridViewTextBoxColumn();
     //myco0.DataPropertyName = "cStationID";
     //myco0.HeaderText = "序 號";
     //myco0.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
     //myco0.ReadOnly = true;
     //myco0.SortMode = DataGridViewColumnSortMode.Automatic;
     //gvData.Columns.Add(myco0);
    
     //gvData.DataSource = dt;
    

    出狀況的電腦也是XP SP3(跟我開發的電腦一樣), 實在搞不懂為什麼..

    想請問各位前輩也有出現過這樣的問題嗎? 該怎麼解決呢? 謝謝!

    2010年9月5日 上午 09:50

所有回覆

  • 請問作業系統是XP embedded 會有影響嗎?

    因為我把相同的程式擺到windows7, visita, xp pro上執行都是正常的, 也都有安裝.net framework 3.5,

    目前能想到唯一不同的就是差在有問題的電腦作業系統是XP embedded的..@@

    2010年9月10日 下午 04:46
  • 您註解掉的那一行程式碼是要加入新欄位到DataGridView, 但是放在Button的Click事件的話, 不是每次按鍵都會執行加入欄位了嗎? 建立把新增欄位的動作放在Form的Load事件處理程序中執行
    2010年9月11日 上午 05:35
  • 您註解掉的那一行程式碼是要加入新欄位到DataGridView, 但是放在Button的Click事件的話, 不是每次按鍵都會執行加入欄位了嗎? 建立把新增欄位的動作放在Form的Load事件處理程序中執行

    謝謝 tihs 大的回覆!

    我有在Click的第一行加上 gvData.Columns.Clear(); 來清除 DataGridView 目前的欄位後才再新增欄位的@@

    剛剛也試著改成您建議的方式後, 放到該台電腦上執行還是會出現一樣的狀態(表單當掉->系統強制關閉表單), 也沒有跑出例外錯誤, 真的很苦惱..


    2010年9月11日 上午 07:16
  • 您的程式有做try..catch, 如果沒有顯示出任何錯誤訊息, 有可能是clsStation類別的getDataSetByStationType方法把錯誤訊息吞掉了
    2010年9月12日 上午 01:57
  • 您的程式有做try..catch, 如果沒有顯示出任何錯誤訊息, 有可能是clsStation類別的getDataSetByStationType方法把錯誤訊息吞掉了

    謝謝 tihs 大的回覆!

    我在 clsStation > getDataSetByStationType 這方法內也是有用try..catch包住, 

    讓它例外會丟出 throw new Exception("錯誤" + ex.Message), 

    因為我單獨只留 

    clsStation Station = new clsStation();

    DataTable dt = Station.getDataSetByStationType(0).Tables[0];

    的話是可以正常執行不會當掉, 只是gvData 裡沒有資料而已, 所以我想這個部份應該是沒問題的@@

    我也試著把.net framework 3.5 移除後重裝還是一樣,

    程式裡的其它功能都可以正常執行, 但是只要遇到 DataGridView 顯示的資料就會當掉, 可是在別台電腦又都可以正常顯示...*__*

     

    2010年9月12日 上午 06:18