2012-04-25 16 views
1

DataTableソースに関連付けられたDataGridViewがあります。テーブル内の要素のデータの中には、私が隠しておきたいGuidがあります。以下のように(。それは、参考のために内部的に使われていますが、表示されるべきではありません)私はテーブルを作成するために使用しているコードは次のとおりです。DataGridViewの非表示の列が非表示になっていません。

private DataTable mEntities = new DataTable(); 
private System.Windows.Forms.DataGridView EntitiesGridView; 

これらは参考のためにここに示し、他の場所で宣言されています。

private void BuildEntityTable() 
{ 
    mEntityTable.Columns.Add("id", typeof(Guid)); 
    mEntityTable.Columns.Add("Name", typeof(string)); 
    ... (some other columns) 

    foreach (Foo foo in mEntities) 
    { 
     DataRow row = mEntityTable.NewRow(); 
     row["id"] = foo.id; 
     row["Name"] = foo.Name; 
     ... (rest of data) 
     mEntityTable.Rows.Add(row); 
    } 

    DataColumn[] entityKeys = new DataColumn[1]; 
    entityKeys[0] = entityTable.Columns["id"]; 
    mEntityTable.PrimaryKey = entityKeys; 

    EntitiesGridView.DataSource = mEntityTable.DefaultView; 

    EntitiesGridView.Columns["id"].visible = false; 
} 

これまでのところとても良いです。テーブルが作成され、目に見える "id"カラムはありません。しかし、後でテーブルに新しいオブジェクトを追加すると、問題が発生します。コードはほぼ同じです:

何らかの理由で、これにより「id」列が戻ってきます。私は前のコードからEntitiesGridView.Columns["id"].visible = false;行をコピーしようとしましたが、うまくいきません。この点の後に私がしていることは、その列を消してしまいます。私が欠けていることの手がかりは?

+0

なぜあなたはmEntitiesとmEntityTableの両方を持っていますか?あなたのように、datagridviewにバインドされたデータテーブルを作成しようとすると、新しい行を追加しても問題は再現されませんでした。エラーを再現する最小限の例を提供するかもしれません。実際には、問題を自分で見つけるかもしれません。また、AddNewObjectはどこから呼び出されますか?私はそれが他のスレッドからロックであると思いますか?問題に寄与する疑いがありますが、あなたが示した以上に少しは進んでいるようです。 –

+0

DataTableはPropertyGridの塗りつぶしに使用されます。 DataGridViewにはDataTableのキー値がいくつか表示され、PropertyGridにはすべての値が表示されます。 (いくつかのケースでは数十人)。物事を混乱させる可能性があるので、私が投稿しなかったことがここで増えています。ここの「Foo」は、実際にはランタイム時に派手なPropertyDescriptorのもので動的に生成されるカスタムクラスです。 AddNewObjectは、ネットワーク上でデータを受け取るXml Parserによって呼び出され、新しいオブジェクトをオンザフライで作成します。私はそれが私がしかし持っている問題に関連していると私はそれをすべて投稿した場合、あまりにも多くのコードになると思う。 –

+0

公正な呼び出しは、これに影響を与えない余分なもののように聞こえます。私が言ったように、ボタンイベントハンドラ内のデータテーブルに追加するだけの簡単な例は問題を再現しません。私が考えることができるのは、このフォーラムスレッドで議論されている問題です。http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/19841219-f1fc-454b-a019-097529a211e1/ –

答えて

1

ちょうど私もこの問題が発生していますが、設計時にあなたのDataGridViewの変更を行うことができることを発見している

datagridview1.Columns[0].visible = false; 
+0

私のコードを見てください。 (2番目のブロックの最後の行)。それは遠ざかりますが、説明できない理由で戻ってきます。 –

0

あなたのForm_Loadで呼び出し、このイベント()

private void dgv_DataBindingComplete(Object sender, DataGridViewBindingCompleteEventArgs e) 
    { 
     DataGridView dgv = (DataGridView)sender; 
     dgv.Columns[3].Visible = false; 
    } 
+0

残念ながら、残念ながら、私はこれを尋ねてから1年以上経っています。これがうまくいくかどうかは分かりません。プロジェクトは長く終わっていて、リコールすれば完全にリファクタリングされました。私はもうコードにアクセスできません... –

0

この行を書きますプロジェクトを保存します。アプリケーションを実行し、アプリケーションから終了します。デザインフォームのdgvが自動的に表示を変更しました。フォームを閉じてから再度開くと、最初にインクルード/除外した列が返されます。この修正には追加のコードは必要ありません。

+0

申し訳ありませんが、これは決してこの質問の回答ではありません - DGVは実行時に必要に応じて設定されます。また、実行時に非表示の列が表示されます。アプリケーションを起動すると表示されませんが、オブジェクトに変更を加えるとそのオブジェクトが表示されます。私はエンドユーザがソースコードとフォームデザイナーにアクセスすることは期待できず、何の役にも立ちません。 (また、このプロジェクトは1年半前に終了しました。私はもはやそこで働いていません。) –

関連する問題