【问题标题】:I am having some trouble with adding checkbox column in a my datagridview我在我的 datagridview 中添加复选框列时遇到了一些问题
【发布时间】:2012-07-12 06:14:04
【问题描述】:

我的页面上有一个 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);

这是第一次加载表单时的图像

这是我多次更改组合框值后的图像

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

【问题讨论】:

  • 每次组合框更改时您都调用SetUpDataGridView?因为你在那里添加了一个复选框列,所以它会继续添加它的调用次数。
  • 所以我应该设置一个计数器以便它只执行第一次???对柜台的外观有什么帮助吗?抱歉,数据网格有点新:(

标签: c# datagridview datagridviewcheckboxcell


【解决方案1】:

在回答之前,我将逐步重申问题(希望我的解决方案更有意义):

  • 您有一个数据绑定的 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 显示。

【讨论】:

  • 哇....这太棒了,虽然我已经解决了我的问题,但我再次重新编码了我的整个表单,这个解决方案看起来很干净......geez thanxx a ton :)
【解决方案2】:

您只需要设置一次gridview。

InitializeComponent() 之后是一个好地方。

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

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

目前你正在添加这一行

dataGridView1.Columns.Add(column3);

会导致复选框列被添加多次。

【讨论】:

  • 您可以尝试在重新创建之前清除列 dataGridView1.Columns.Clear
  • 但我经常更改数据源(即每次有人更改组合框值时我触发查询后填充记录的数据表),所以如果我不调用 setupdatagridview 它不会被破坏每次我更改数据源时的方法???
  • 好的,我试图按照你所说的清除列,但它在下一行出现异常:索引超出范围。必须是非负数且小于集合的大小。参数名称:索引
  • Clear 会清除所有列,所以像dataGridView1.Columns[0] ... 这样的东西会失败
  • 来吧伙计们,帮我解决这个问题:dataGridView1.Columns.Add(column3);
猜你喜欢
  • 2012-04-09
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 2022-11-23
相关资源
最近更新 更多