C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: DataGridViewのスタイルが反映されない


(過去ログ 126 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■74923 / inTopicNo.1)  DataGridViewのスタイルが反映されない
  
□投稿者/ ふる (2回)-(2015/02/09(Mon) 21:49:25)

分類:[.NET 全般] 

Form1のボタンをクリックすることでForm2を表示します。
Form2にはDataGridViewが設置されています。

Form1のコードです。
private void button1_Click(object sender, EventArgs e)
{
Form2 f = new Form2();
// 1
      f.init();
f.Show();
      // 2 f.init();
}

Form2のコードです。
public void init()
{
List<Dictionary<string, string>> list = new List<Dictionary<string, string>>();
Dictionary<string, string> map = new Dictionary<string, string>();
map["a"] = "123";
list.Add(map);
this.dataGridView1.DataSource = list;

this.dataGridView1.Rows[0].Cells[0].Style.BackColor = Color.Black;
}

Form1の1(フォームの表示前)にセルスタイルを変更しても画面に反映されていません。
2の位置(フォームの表示後やLoadイベント中)であれば反映されています。
データソースに設定された値は出力されているのですがなぜスタイルは反映されないのでしょうか。

Form1の1で呼び出した場合、画面にスタイルを反映する方法はあるのでしょうか。
引用返信 編集キー/
■74929 / inTopicNo.2)  Re[1]: DataGridViewのスタイルが反映されない
□投稿者/ WebSurfer (501回)-(2015/02/10(Tue) 10:31:53)
No74923 (ふる さん) に返信

コードをアップする時は、[投稿モード]の選択で[図表モード]を選んでいただくよう
お願いします。そうしないとインデントが無くなって読みにくいです。

> Form1の1(フォームの表示前)にセルスタイルを変更しても画面に反映されていません。

f.init(); を1の行にすると this.dataGridView1.Rows[0].Cells[0].Style.BackColor = Color.Black;
が無視され、2の行にすると期待通り黒になるということですか?
引用返信 編集キー/
■74932 / inTopicNo.3)  Re[2]: DataGridViewのスタイルが反映されない
□投稿者/ Hongliang (277回)-(2015/02/10(Tue) 12:45:49)
状況によって、DataGridViewはDataSourceが設定されたタイミングではDataGridViewColumn / DataGridViewRowを生成しない場合があります。
(主にコントロールが表示前のケース)
ですので、DataGridViewColumn(AutoGenerateColumns=trueの場合)やDataGridViewRowに触るのは、基本的に、DataSourceとは離れたところで行った方が良いでしょう。
たとえばShow前にDataSourceに設定するなら、フォームのLoadイベントで触るとか。
任意のタイミングでDataSourceを表示中に動的に変更するなら、DataBindingCompleteイベントで触るとか。
引用返信 編集キー/
■74935 / inTopicNo.4)  Re[3]: DataGridViewのスタイルが反映されない
□投稿者/ PANG2 (60回)-(2015/02/10(Tue) 14:00:14)
2015/02/10(Tue) 14:01:26 編集(投稿者)
private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
	System.Diagnostics.Debug.WriteLine("ColumnCount=" + dataGridView1.ColumnCount);
	System.Diagnostics.Debug.WriteLine("RowCount=" + dataGridView1.RowCount);
	System.Diagnostics.Debug.WriteLine(Environment.StackTrace);
}

実験してみると、DataSourceに設定したときに2回、Showで1回データバインドが走ります。
行数が多いと処理が重くなるので、Show前にDataSouceを設定するのは不適です。
以下だと、データバインドは1回だけですみます。

Form2 f = new Form2();
f.Load += delegate { f.Init(); };
f.Show();

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -