お世話になります。
現在、windowsformアプリケーションのdatagridviewにあるチェックボックスからチェック値を取得するコードを書いています。
ここで、不明な点が2点あるのでご質問させていただきました。
1 Button.click イベントから発生させると値が取得できる。
2 ToolStripMenuItem.click イベントから発生させると値が取得できない。
同コードを呼び出しているのに動作に差異が発生する原因がわかりません。
ご教授よろしくお願いします。コードは以下になります。
C#
1 private Func<DataGridView, IEnumerable<DataGridViewRow>> FileTarget = 2 (DataGridView c) => c.Rows.Cast<DataGridViewRow>().Where(n => (bool)n.Cells[0].Value== true);
vb
1vb.net 2 3Private FileTarget As Func(Of DataGridView, IEnumerable(Of DataGridViewRow)) = 4 Function(c) c.Rows.Cast(Of DataGridViewRow).Where(Function(d) CBool(d.Cells(0).Value) = True) 5
追記)
本来ならdatagridview内のcheckboxの値はtrue,false なのですが、2の場合のみnull,nothingとなります。
そして、キャスト失敗時のエラーが発生します。
追記2)
datagridviewに関してですが、基本はSQLの結果を表示する、参照画面として使用しています。
又、checkBox以外は全てreadOnely= trueにしており、新規追加、編集はできません。
その他設定プロパティ
.DataGridViewSelectionMode.FullRowSelect
.MultiSelect = False
.Resizable = DataGridViewTriState.False
.AllowUserToAddRows = False
.AllowUserToDeleteRows = False
後、色々と試してみたのですが、同form上のdatagridviewと、ToolStripMenuItem以外をアクティブにすると2 でも結果が取得できました。
原因は不明です。
追記3)
どちらも foreach(DataGridViewRow test in FileTarget(targetGridview))として使用しています。
追記4)
datagridview内にデータを挿入するのは起動時のloadイベント時となります。
test sorce
c#
1 public Form1() 2 { 3 InitializeComponent(); 4 5 dataGridView1.Columns.Add(new DataGridViewCheckBoxColumn()); 6 dataGridView1.Columns.Add("a","a"); 7 dataGridView1.Columns.Add("b", "b"); 8 dataGridView1.Columns.Add("c","c"); 9 dataGridView1.Columns.Add("d", "d"); 10 dataGridView1.Rows.Add(false, "1", "1", "1"); 11 dataGridView1.Rows.Add(false, "2", "2", "2"); 12 dataGridView1.Rows.Add(false, "3", "3", "3"); 13 dataGridView1.Rows.Add(false, "4", "4", "4"); 14 dataGridView1.Rows.Add(false, "5", "5", "5"); 15 dataGridView1.Rows.Add(false, "6", "6", "6"); 16 17 18 dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; 19 20 dataGridView1.MultiSelect = false; 21 dataGridView1.Rows[0].Resizable = DataGridViewTriState.False; 22 dataGridView1.AllowUserToAddRows = false; 23 dataGridView1.AllowUserToDeleteRows = false; 24 dataGridView1.AllowUserToAddRows = false; 25 dataGridView1.AllowUserToDeleteRows = false; 26 dataGridView1.RowHeadersVisible = false; 27 28 } 29 30 31 private Func<DataGridView, IEnumerable<DataGridViewRow>> FileTarget = 32 (DataGridView c) => c.Rows.Cast<DataGridViewRow>().Where(n => (bool)n.Cells[0].Value == true); 33 34 private void button1_Click(object sender, EventArgs e) 35 { 36 foreach (DataGridViewRow d in FileTarget(dataGridView1)) 37 { 38 //内部へ入る 39 MessageBox.Show((string)d.Cells[1].Value) ; 40 41 }; 42 43 } 44 45 private void test1ToolStripMenuItem_Click(object sender, EventArgs e) 46 { 47 48 foreach (DataGridViewRow d in FileTarget(dataGridView1)) 49 { 50 //内部へ入らない 51 MessageBox.Show((string)d.Cells[1].Value); 52 53 }; 54 55 } 56 57 58




回答2件
あなたの回答
tips
プレビュー