2013-07-28 57 views
3

我在winforms.net 4應用程序中遇到了一個奇怪的行爲。我有一個帶有兩個tabpages的tabcontrol的表單,用戶選擇tabpage1上的數據並點擊GO按鈕,有一個dataGridView控件綁定到用戶選擇的結果(一個datatable)。在設置datagridview的數據源之後,我在網格的數據源的頂部(0索引)添加一行,然後我在該行上應用一些格式(datagirdview.rows [0])。Datagirdview和tabcontrol問題

我可以看到我的格式應用於調試器中的行,但一旦選項卡選擇代碼運行,我的行格式(isFrozen,BackColor等)就消失了。

當我首先選擇tabpage並綁定網格的數據源和格式設置後,它工作正常。

只有新添加的行丟失格式化,我有一個類似的應用程序,其中我添加了這樣一行,但它工作正常,在當前應用程序中我使用了backgroundWorker並從RunWorkerCompleted運行此代碼,以前的應用程序我不使用backGroundWorker。

下面是代碼

void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     if (!e.Cancelled && e.Error == null) 
     { 
      if (((DataTable)e.Result).Rows.Count > 0) 
      { 

       //tabControl1.SelectTab(tabPage2); if I call from here then row formatting retains 
       grdDistProcessing.DataSource = ((DataTable)e.Result); 
       formatGrid(); 
       loadStoresGrid(); 
       AddTotalsRowInEnd(); 
       SetTotalsOfTotalRow(); 
       tabControl1.SelectTab(tabPage2); 
      } 
     } 

     this.tsStatus.Text = string.Empty; 
    } 

這裏是AddTotalsRowInEnd方法:

private void AddTotalsRowInEnd() 
    { 
     Font f = new System.Drawing.Font("Arial", 8, FontStyle.Bold); 
     DataRow dr = ((DataTable)grdDistProcessing.DataSource).NewRow(); 
     dr.ItemArray = ((DataTable)grdDistProcessing.DataSource).Rows[0].ItemArray; 
     dr["Itemlookupcode"] = "Grand Totals"; 
     dr["Size"] = ""; 
     dr["COLORS"] = ""; 
     dr["DESCRIPTIONS"] = ""; 

     ((DataTable)grdDistProcessing.DataSource).Rows.InsertAt(dr, 0); 
     grdDistProcessing.Rows[0].Frozen = true; 
     grdDistProcessing.Rows[0].DefaultCellStyle.BackColor = Color.BurlyWood; 
     grdDistProcessing.Rows[0].DefaultCellStyle.ForeColor = Color.Black; 
     grdDistProcessing.Rows[0].DefaultCellStyle.Font = f; 
     grdDistProcessing.Rows[0].ReadOnly = true; 
     grdDistProcessing.Refresh(); 
    } 

這裏是我的DoWork:

void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     try 
     { 
      BackgroundWorker bWorkder = sender as BackgroundWorker; 
      DistVariablesTransfer dtr = e.Argument as DistVariablesTransfer; 
      bWorkder.ReportProgress(10); 
      cProcess pro = new cProcess(); 
      e.Result = pro.loadDistribution(dtr.pWarehouseID, dtr.pStores, dtr.pStyle, dtr.pColor, dtr.pSize, dtr.pDateFrom, dtr.pDateTo, dtr.pIncOrdQtyForSrc, dtr.PCheckDestinationTranferOut); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 

    } 
+0

我有同樣的問題。在我的應用程序中有五個選項卡。應用程序中的前四個選項卡都包含datagridviews。前三項工作完美無瑕。但是,第四個選項卡中的datagridview存在與上述相同的問題。第一次加載時缺少設置的背景顏色,但在隨後的所有加載中都會顯示格式。打開雙緩衝區沒有幫助。如果我找到解決方案,將在這裏發佈。 –

回答

1

而不是做:

grdDistProcessing.Rows[0].DefaultCellStyle.BackColor = Color.BurlyWood; 
grdDistProcessing.Rows[0].DefaultCellStyle.ForeColor = Color.Black; 

使用CellFormatting事件(顯示類別)爲grdDistProcessing,像這樣:

private void grdDistProcessing_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    e.CellStyle.BackColor = Color.BurlyWood; 
    e.CellStyle.ForeColor = Color.Black; 

} 

應該渲染速度更快了。

+0

它已經兩年了,我換了公司,但該應用程序仍在生產中:)我必須先選擇選項卡,因爲那時我沒有找到任何解決方案。 – alphaprolix