2012-07-12 60 views
0

我遇到了一些麻煩我的頁面上有一個datagridview,其數據源不斷變化基於從2組合框, 對值檢索記錄我需要添加一個複選框列到我的DataGrid中,這與從我的數據庫表中的任何列中沒有數據綁定,我使用這個代碼我在添加複選框列在我的datagridview

public void RefreshDataGrid(string query) 
     { 
      Buisness_logic bl = new Buisness_logic(); 
      dataGridView1.DataSource = bl.GetDataTable(query); 
      SetUpDataGridView(); 
      dataGridView1.ClearSelection(); 
     } 

     public void SetUpDataGridView() 
     { 

      DataGridViewCellStyle style = dataGridView1.ColumnHeadersDefaultCellStyle; 
      style.BackColor = Color.White; 
      style.ForeColor = Color.Black; 
      dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically; 
      dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None; 
      dataGridView1.RowHeadersVisible = false; 
      dataGridView1.Columns[0].HeaderText = "Sr.No"; 
      dataGridView1.Columns[0].Width = 50; 
      dataGridView1.Columns[1].HeaderText = "Rate"; 
      dataGridView1.Columns[1].Width = 70; 
      dataGridView1.Columns[2].HeaderText = "Amount"; 
      dataGridView1.Columns[2].Width = 100; 
      dataGridView1.Columns[3].HeaderText = "Mode"; 
      dataGridView1.Columns[3].Width = 60; 
      dataGridView1.Columns[4].HeaderText = "Support"; 
      dataGridView1.Columns[4].Width = 80; 
      dataGridView1.Columns[5].HeaderText = "Team1"; 
      dataGridView1.Columns[5].Width = 100; 
      dataGridView1.Columns[6].HeaderText = "Team2"; 
      dataGridView1.Columns[6].Width = 100; 
      dataGridView1.Columns[7].HeaderText = "Team3"; 
      dataGridView1.Columns[7].Width = 100; 
       DataGridViewCheckBoxColumn column3 = new DataGridViewCheckBoxColumn(); 
       column3.Name = "Column3"; 
       column3.HeaderText = "IsCheck"; 
       column3.ReadOnly = false; 
       dataGridView1.Columns.Add(column3); 
     } 

它的DataGridView是好當TGE形式加載的第一次,但是當我改變的價值組合框和數據源發生變化,列被搞砸了,沒有。的複選框列得到補充,並且毀了我的形式,

這裏是我用來從表中檢索記錄

Combo_pair pr1 = combo_match_code.SelectedItem as Combo_pair; 
       int match_code_f1 = Convert.ToInt32(pr1.Text); 
       Combo_pair pair = combo_name.SelectedItem as Combo_pair; 
       int userid_f1 = Convert.ToInt32(pair.Value); 
       string query = "Select int_sr_no,double_rate,double_amount,txt_mode,txt_support,double_team1,double_team2,double_team3 from match_transaction where int_match_code='" + match_code_f1 + "' AND int_user_id='" + userid_f1 + "' AND is_deleted=0"; 
       RefreshDataGrid(query); 

這是圖像的代碼加載窗體時首次

enter image description here

,這是圖像後,我改變了組合框值幾十倍

enter image description here

*(對不起,具有圖像麻煩) 我真的需要一些幫助這些,thanxx

+0

對於每個組合框更改,您正在調用'SetUpDataGridView'?既然你添加了一個複選框列,它會繼續添加其被調用的次數。 – V4Vendetta 2012-07-12 06:17:52

+0

所以我應該設置一個計數器,以便它只執行第一次?任何幫助如何計數器必須看起來像?遺憾與數據網格還挺新:( – 2012-07-12 06:23:45

回答

0

的答案,我只是要重申步驟的問題之前(使我的解決方案希望更有意義):

  • 你必須要更改列
  • 細節的數據綁定的DataGridView
  • 當你想刷新網格中的數據(您的搜索條件改變)你對列更改被覆蓋
  • 爲了解決這個問題,你更新日期電網數據源,並重新制作所有的變化
  • 這樣做的副作用是未綁定複選框列加上被多次添加

那麼概括的問題是如何保持更改列,同時也只具有一列

這裏的技巧是DataGridView的AutoGenerateColumns屬性。

爲了討論放開的緣故是說,窗體加載過程中你第一次設置你的網格 - 如果不是,那麼你可能需要一個布爾字段來存儲,如果你有以前設置的網格。

public Form1() 
{ 
    InitializeComponent(); 

    // So this is the first time we call your refresh grid with some default string query 
    RefreshDataGrid(query); 

    // Now one time only we call SetUpDataGridView() 
    SetUpDataGridView(); 

    // Now once we have done that we set AutoGenerateColumns to false 
    dataGridView1.AutoGenerateColumns = false; 

} 

public void RefreshDataGrid(string query) 
{ 
    Buisness_logic bl = new Buisness_logic(); 
    dataGridView1.DataSource = bl.GetDataTable(query); 
    // We no longer need to call SetUpDataGridView() 
    // SetUpDataGridView(); 
    dataGridView1.ClearSelection(); 
} 

你SetUpDataGridView()方法是幾乎相同的:

public void SetUpDataGridView() 
{ 

    DataGridViewCellStyle style = dataGridView1.ColumnHeadersDefaultCellStyle; 
    style.BackColor = Color.White; 
    style.ForeColor = Color.Black; 
    dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically; 
    dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None; 
    dataGridView1.RowHeadersVisible = false; 
    dataGridView1.Columns[0].HeaderText = "Sr.No"; 
    dataGridView1.Columns[0].Width = 50; 

    // And so on for all the columns... 

    dataGridView1.Columns[7].Width = 100; 
    DataGridViewCheckBoxColumn column3 = new DataGridViewCheckBoxColumn(); 
    column3.Name = "Column3"; 
    column3.HeaderText = "IsCheck"; 
    column3.ReadOnly = false; 
    dataGridView1.Columns.Add(column3); 
} 

所以現在當包含查詢信息的combboxes改變你可以調用RefreshDataGrid(),但它只會更新數據,不會改變您的自定義設置。爲RefreshDataGrid


一個建議()方法是添加一行像這樣:

public void RefreshDataGrid(string query) 
{ 
    Buisness_logic bl = new Buisness_logic(); 
    // This is the new line 
    dataGridView1.DataSource = typeof(List<>); 
    dataGridView1.DataSource = bl.GetDataTable(query); 
    // We no longer need to call SetUpDataGridView() 
    // SetUpDataGridView(); 
    dataGridView1.ClearSelection(); 
} 

這可以減少閃爍作爲列寬改變,並且還往往是必要的,使改變的數據源顯示在所有。

+0

哇....這真棒,雖然我已經解決了我的問題,我再次編碼我的整個表單,這個解決方案看起來很乾淨...... geez thanxx一噸:) – 2012-07-24 07:04:13

0

您需要設置gridview的只有一次。

一個好的地方是在InitializeComponent()之後。

由於這是一個固定列,您還可以通過設計器(Edit Columns)添加它。 這樣代碼將被添加到InitializeComponent()

InitializeComponent()通常在窗體的構造函數中調用。

目前你正在加入這一行

dataGridView1.Columns.Add(column3); 

將導致添加複選框列幾次。

+0

你可以嘗試重新創建這些dataGridView1.Columns.Clear – JohnnBlade 2012-07-12 06:26:37

+0

之前清除列,但我經常變化的數據源(即充滿了記錄後我火查詢每次有人更改組合框的值數據表) ,所以不會被破壞,如果我不打電話setupdatagridview方法埃夫裏時間我改變數據源??? – 2012-07-12 06:28:56

+0

好吧,我試圖清除列,因爲你說,但它會在下一行的例外:索引超出範圍必須爲非負數且小於集合的大小 參數名:。指數 – 2012-07-12 06:31:24