0

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

4

2 回答 2

0

您只需要设置一次gridview。

这样做的好地方是 after InitializeComponent()

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

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

目前您正在添加此行

dataGridView1.Columns.Add(column3);

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

于 2012-07-12T06:24:48.147 回答
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 显示。

于 2012-07-12T17:35:23.753 回答