4

フォームのイベント ハンドラー中にDataGridViewComboBoxColumna を追加し、列のそれぞれの DataSource を設定しています。ただし、フォームが表示されると、それぞれの DataSource はに設定されています。列とそのセルにデータを入力するために使用するコードは次のとおりです。DataGridViewLoadDataGridViewComboBoxCellDataGridViewComboBoxCellnull

DataGridViewComboBoxColumn comboCol;

comboCol = new DataGridViewComboBoxColumn();
comboCol.Name = "ComboCol";
comboCol.HeaderText = "Combo Column";
comboCol.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

this.dgv.Columns.Add(comboCol);

for (int i = 0; i < dgv.Rows.Count; i++)
{
    // This datatable is actually populated here!
    DataTable myData = PopulatedDataTable(dgv.Rows[i].Cells["info"].Value); 

    DataGridViewComboBoxCell DCC = new DataGridViewComboBoxCell();

    DCC = (DataGridViewComboBoxCell)dgv.Rows[i].Cells["CombolCol"];
    DCC.DataSource = myData;

    DCC.DisplayMember = "Association"; // Association is a column in myData
    DCC.ValueMember = "Association";
}

dgv.Columns["association"].Visible = false;

このコードは、フォームがロードされた後にクリックするボタンに配置した場合に期待どおりの動作をしますが、フォームのロード中に実行すると DataSource がクリアされます。助言がありますか?

4

3 に答える 3

6

DataBindingCompleteデータグリッドのイベントを処理することで、この問題を修正しました。

どうやら、フォームのLoadイベント中にデータグリッドにデータを入力すると、データグリッド内のデータが再バインドされます。これにより、追加しようとしていたバインドされていない列のデータが台無しになりました。

上記のコードをDataBindingCompleteイベント ハンドラーに配置する (そしてイベント ハンドラーを最初に無効にし、イベントの最後に再度有効にする) ことで、適切なタイミングで列が追加され、.NET の愚かさによってデータがスクランブルされることはありません。 .

于 2011-05-05T13:57:35.020 に答える
4

はい、2 日間苦労しましたが、最終的に DataBinding イベントで修正されました。

DataGridView の一部のセルにコンボ ボックス セルを追加する完全なコードを次に示します。

    private void LoadGrid()
    {
        DataTable dtbl = new DataTable();
        dtbl.Columns.Add("FieldNo");
        dtbl.Columns.Add("FieldValue");

        for (int i = 0; i < 10; i++)
        {
            DataRow dr = dtbl.NewRow();
            dr["FieldNo"] = i;
            dr["FieldValue"] = "Name " + i.ToString();
            dtbl.Rows.Add(dr);
        }

        dataGridView1.DataSource = dtbl;
        dataGridView1.DataError += new DataGridViewDataErrorEventHandler(dtgv_ComboDataError);
    }

    private void dtgv_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        for (int i = 0; i < dataGridView1.Rows.Count; i++)
        {
            if (i % 2 == 0)
            {
                DataGridViewComboBoxCell dCmb = new DataGridViewComboBoxCell();
                dCmb.Items.Add("Yes");
                dCmb.Items.Add("No");
                dCmb.Value = dCmb.Items[0];
                dataGridView1["FieldValue", i] = dCmb;

                ((DataGridViewComboBoxCell)dataGridView1["FieldValue", i]).DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox;
            }
        }
    }

    void dtgv_ComboDataError(object sender, DataGridViewDataErrorEventArgs e)
    {
        //Nothing needed here
    } 
于 2012-03-22T14:14:47.793 に答える
1

私は で非常によく似た問題に苦しんでいDataGridViewますDataGridViewComboBoxColumn

DataGridViewセルのドロップダウン オプションは、同じ行の別DataSetDataGridViewComboBoxCellセルの値に従って入力されます。

ComboBoxセル項目を手動で入力する (プロパティ)かDataGridViewComboBoxCell.Items、DataBinding (プロパティ) を使用するかに関係なく、イベント ハンドラーDataGridViewComboBoxCell.DataSourceに入る直前に値は正しいですが、ハンドラーの実行ステップが完了するとすぐにゼロになります。CellFormattingmyComboBoxCell.Items.Count

セルの値が 以外の場合DBNull.Value、厄介な「System.ArgumentException: DataGridViewComboBoxCell 値が無効です」がスローされます。(myComboBoxCell.Valueは に含まれていないためmyComboBoxCell.Items)

私の「解決策」は回避策DataGridView.DataErrorです。イベントを処理し、DataGridComboBoxCellそのハンドラー内の関連する DataSource に入力します。その後、例外をキャンセルします ( e.ThrowException = False)。

私の好みには少し汚れていますが、機能します。

于 2011-05-04T07:59:30.247 に答える