2

遭遇した問題をデバッグするためのテスト プロジェクトを作成しましたが、ここで何が起こっているのか理解できないようです...このテスト プロジェクトには、フォーム、TabControl、および DataGridView (dgvTest と呼ばれる) しかありませんtabControl 内の「背景」ページ (ページ 2 以降)。問題を再現するために使用したコードは次のとおりです。

    private void Form1_Load(object sender, EventArgs e)
    {
        dgvTest.DataSource = GetDataSource();
        DataGridViewColumn customColumn = new DataGridViewColumn(new DataGridViewTextBoxCell());
        customColumn.DataPropertyName = "SampleColumn";
        dgvTest.Columns.Insert(dgvTest.Columns["SampleColumn"].Index, customColumn);
        //#region Attempt #1
        //dgvTest.Columns.Remove("SampleColumn");
        //customColumn.Name = "SampleColumn";
        //#endregion
        #region Attempt #2
        dgvTest.Columns["SampleColumn"].Visible = false;
        customColumn.Name = "SampleColumnCbo";
        #endregion
        dgvTest.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
    }

    private DataTable GetDataSource()
    {
        DataTable result = new DataTable();
        result.Columns.Add("SampleColumn");
        result.Columns.Add("Q");
        //no rows needed
        return result;
    }

ここで、これを実行すると、DataGridView は、それが存在する tabPage を選択しようとした後にのみ完全に初期化されます (つまり、その AutoGenerateDataBoundColumns を呼び出します)。その時点で、「列を追加できない」という InvalidOperationException がスローされますその CellType プロパティが null であるためです。 " または " DataGridView コントロールの列の少なくとも 1 つにセル テンプレートがありません。 " (基本的には同じことですが、最初のプロジェクトと初期段階で最初のメッセージしか取得できませんでした。コードを現在の状態に最小化する前のテスト プロジェクト)。奇妙なことに、dgvTest が 1 番目の tagPage に配置されている場合、または Form 自体に直接配置されている場合、この Exception はスローされません。

何か案は?前もって感謝します。

4

1 に答える 1

3

これは、DataSource を設定したとき (Form1_Load コードが呼び出されたとき)、後で例外がトリガーされなくても、DataGridView が (バックグラウンド タブで) 表示されないという事実に関連しているようです。たとえばVisibleChanged、DataGridView のイベントを処理し、代わりに Form1_Load コードをそこに移動すると、TabPage nが最初にクリックされたときにのみ初期化コードが起動するように注意するだけで機能します (事実上、疑似初期化イベント)。

private bool dgvInitialized = false;

private void dgvTest_VisibleChanged(object sender, EventArgs e)
{
    if (dgvTest.Visible && !dgvInitialized)
    {
        dgvInitialized = true;

        // Move Form1_Load code to here instead...
    }
}
于 2013-04-20T17:03:31.907 に答える