0

ページにデータグリッドビューがあり、そのデータソースは、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

グリッドビューを一度だけセットアップする必要があります。

これを行うのに適した場所は ですInitializeComponent()

これは固定列であるため、デザイナー (列の編集) を使用して追加することもできます。そうすれば、コードは に追加されInitializeComponent()ます。

InitializeComponent()通常、フォームのコンストラクターで呼び出されます。

現在、この行を追加しています

dataGridView1.Columns.Add(column3);

チェックボックス列が数回追加されます。

于 2012-07-12T06:24:48.147 に答える
0

答えの前に、問題を段階的に言い直します(私の解決策がより理にかなっていることを願っています):

  • 列の詳細を変更するデータバインドされた DataGridView があります
  • グリッド内のデータを更新する場合 (検索基準が変更された場合)、列への変更は上書きされます
  • これを修正するには、日付グリッド データソースを更新し、すべての変更をやり直します
  • これには、追加したバインドされていないチェックボックス列が複数回追加されるという副作用があります

一言で言えば、問題は列への変更を保持する方法ですが、列は 1 つしかありません。

ここでのトリックは、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() メソッドの 1 つの提案は、次のような行を追加することです。

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 に答える