質問: (DataGridView)c; foreach( DataGridViewRow r in dgv.Rows) foreach( DataGridViewCell c in r.cells) msg += c.Value.ToString() + "\n"; // DataGridViewはDataGridViewCells.Value==nullなセルが発生することがあるけどここでは無視 Messagebox.Show(msg); } else if(c is Button) { // ここに ### 発生している問題・エラーメッセージ に乗せたコードが載るイメージ } } } ``` 実際に実行させてるコードを元に読みやすくなるよう改変したコードなのでまんまで動かすことはできないと思います。参考まで。 ### 試したこと 兼参考にしたページ集 InvokeMemberを使ってみる MethodInfo.Invokeを使ってみる ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。 * Visual Studio 2015 SP1 * Windows 7 64bit
回答: なんか動きました。 なんでだろう? ``` // これでなぜか動く // よく見たらこれ使ってないじゃん//Type buttonType = b.GetType(); // 使ってないじゃん //MethodInfo PerformClickInfo = buttonType.GetMethod("PerformClick", BindingFlags.Public | BindingFlags.InvokeMethod); // なぜActionなどという型に変換しないといけないのかはわからない。 // Action型、Func型はDelegate型の子分?Delegateをインタフェースとした関数ポインタ機能をC#で実現するクラス?? // CreateDelegate()の第一引数がActionまたはFuncの二択からの選択? // 第二引数は実行を担当するインスタンス?(または実行するメモリ上の位置とか?) // 第三引数は実行したい関数のメタデータ? var local_InvokePerformClick = (Action)Delegate.CreateDelegate(typeof(Action), // Typeを指定するがよく意味がわからない b, // 別の方法だと「別スレッドからコントロールを触っちゃだめなんだよ!」って怒られるんだけどCreateDelegateだと参照するだけなんだろうか? // ていうかButtonのインスタンスじゃなくてFormのインスタンスのほうがよかったんだろうか b.GetType().GetMethod("PerformClick")); // たぶんメモリのどこら辺からどこら辺を実行してねみたいな指定なんだと思う。 Invoke(local_InvokePerformClick); ``` 意味もわからず書いたコードなので数日置きます 回答がいただけないようならばもうこれがベストアンサーです。