我在我的datagridview中添加checkbox列时遇到了一些麻烦

时间:2012-07-12 06:14:04

标签: c# datagridview datagridviewcheckboxcell

我的页面上有一个datagridview,其数据源根据使用2个组合框中的值对检索的记录不断变化, 我需要在我的数据网格中添加一个复选框列,该数据网格与数据库表中的任何列都没有数据绑定,我正在使用此代码

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);
        }

当tge表单第一次加载时,datagridview很好,但是当我更改组合框的值并且数据源发生变化时,列会搞砸,并且没有。的复选框列被添加并且会破坏我的表单,

这是我用来从表中检索记录的代码

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

*(抱歉,图片有问题) 我真的需要一些帮助,比这些

2 个答案:

答案 0 :(得分:0)

您只需要设置一次gridview。

执行此操作的好地方是InitializeComponent()之后。

由于这是一个固定列,您还可以通过设计器(编辑列)添加它。 这样代码就会添加到InitializeComponent()

InitializeComponent()通常在表单的构造函数中调用。

目前您正在添加此行

dataGridView1.Columns.Add(column3);

将导致复选框列多次添加。

答案 1 :(得分: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);
}

所以现在当包含查询信息的组合框发生变化时,您可以调用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();
}

这可以减少列宽变化时的闪烁,并且通常也需要更改DataSource节目。