4

特にグリッドを更新してリスト内の列を動的に構築するときの列の奇妙な動作とその可視性について、 SOで多くの投稿を見てきましたが、満足のいく解決策は見つかりませんでした。

掘り下げた後、この問題はメソッドの使用によるものであるとほぼ確信していますDataGridView.Columns.Clear()

これまでのところ、理由を突き止めることはできませんでしたが、DataGridView 列を動的に構築するときに Clear() メソッドを削除すると、非表示の列が表示されなくなりますが、なぜこれが影響するのかわかりませんか? 確かに、Columns コレクションをクリアし、使用DataGridView.Columns.Add()して新しいコレクションの追加を開始する場合は、次のようにコードします。

dataGridView1.Columns.Clear(); // This is the offending method!!

dataGridView1.AutoGenerateColumns = false;
dataGridView1.ShowEditingIcon = false;
dataGridView1.RowHeadersVisible = false;

DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
col.DataPropertyName = "ID";
col.HeaderText = "ID";
col.Visible = false; // Notice the visibility of this column...
dataGridView1.Columns.Add(col);

... // Code is repeated for other columns in the collection

何も問題はありませんがdataGridView1.Columns.Clear();、最初に が含まれている場合、非表示の列が表示されます。これはバグですか?

4

2 に答える 2

3

問題を再現できました。メソッド呼び出しは問題ありません。Clear列を 1 つずつ削除しても問題は解決しません。「問題のある」呼び出しは驚くべきことに次のAddとおりです。

col.Visible = false; // Notice the visibility of this column...
if (col.Visible)
{
   // Just to be sure. Never get here.
}
dataGridView1.Columns.Add(col);
if (col.Visible)
{
   // Surprise! We are here.
}

なぜこの動作が発生するのですか?

それは間違いなくバグです。この問題は、次の条件がすべて満たされている場合にのみ発生します。

  1. DataGridViewバウンドモードです。つまり、DataSource設定されています。データ ソースの種類は関係ありません。
  2. Columnsコレクションは空です
  3. Addメソッドは、次のカラムで呼び出されますVisible = false

この場合、コードは内部クラスDataGridViewDataConnectionメソッドにヒットしMatchCurrencyManagerPositionます。ソースコード、特に

// Treat case where columnIndex == -1. We change the visibility of the first column.

コメントとそのコメントの後のコード ブロック。

それを回避する方法

要約すると、これはデータ バインド モードでのみ発生し、非表示に設定されている場合は最初に追加された列に対してのみ発生します。

したがって、それを修正するにはいくつかの方法があります。

  1. 列を再設定するときは、グリッドがバインド モードになっていないことを確認してください

    var dataSource = dataGridView.DataSource;
    dataGridView.DataSource = null;
    // Repopulate columns
    //...
    dataGridView.DataSource = dataSource;
    
  2. Addメソッドを使用しないでください。すべての列を作成し、それらを変数または一時リストに保持し、最後にそのAddRangeような効果のないメソッドを使用します。

  3. Visible = false事前に設定しないでください。すべての列を作成して追加し、目的の列を非表示にします。

于 2016-07-03T09:07:04.820 に答える