DOBON.NET DOBON.NETプログラミング掲示板過去ログ

【C#】DataGridView上_Enterキー押下で、Clickイベントを実行する方法

環境/言語:[C# VisualStudio2008 NET Framework3.5]
分類:[.NET]

いつもお世話になっております。
質問をお願い致します。

DataGridViewで作成している明細があり、行をクリックすると、明細行に紐づくTAB形式の一覧を表示します。
現状、ClickイベントにてTAB形式の一覧を表示することは出来ますが、
Enter押下でClickイベントを実行させ、一覧を表示する方法がわかりません。
以下の様にKeyDownイベントを実装し、Clickイベントを起したいのですがEventArgsの形式も違うので手こずっております。
アドバイス、参考になるサイトがあれば、教えて頂けないでしょうか?
宜しくお願い致します。

private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
dvgRequestNoList_cellClick(sender, e);
}
}

private void dvgRequestNoList_cellClick(object sender, EventArgs e)
{
//一覧を作成する処理
}

-------------|
|明細データ |
-------------|

---------------------|
| tab1 | tab2 | tab3 |
---------------------------|
| データ |
|--------------------------|
| データ |
|--------------------------|
| データ |
|--------------------------|
■No28512に返信(talmanさんの記事)
> 現状、ClickイベントにてTAB形式の一覧を表示することは出来ますが、
> Enter押下でClickイベントを実行させ、一覧を表示する方法がわかりません。
> 以下の様にKeyDownイベントを実装し、Clickイベントを起したいのですがEventArgsの形式も違うので手こずっております。

単純に Click イベントでやっている処理をメソッドに抽出して、Enter キーの KeyDown にて同じくそのメソッドを呼べば良いだけです。

そもそもイベントは内部的に Raise され、外部でそのタイミングを補足できるからこそ 'イベント' なのであって、外部から Raise するものではないです。
任意のタイミングで何かしたいのであれば、イベントではなくメソッドを呼びます。
■No28513に返信(じゃんぬねっとさんの記事)
> ■No28512に返信(talmanさんの記事)
>>現状、ClickイベントにてTAB形式の一覧を表示することは出来ますが、
>>Enter押下でClickイベントを実行させ、一覧を表示する方法がわかりません。
>>以下の様にKeyDownイベントを実装し、Clickイベントを起したいのですがEventArgsの形式も違うので手こずっております。
>
> 単純に Click イベントでやっている処理をメソッドに抽出して、Enter キーの KeyDown にて同じくそのメソッドを呼べば良いだけです。
>
> そもそもイベントは内部的に Raise され、外部でそのタイミングを補足できるからこそ 'イベント' なのであって、外部から Raise するものではないです。
> 任意のタイミングで何かしたいのであれば、イベントではなくメソッドを呼びます。

じゃんぬさん、ご回答ありがとうございます。
勉強になります。

> 単純に Click イベントでやっている処理をメソッドに抽出して、Enter キーの KeyDown にて同じくそのメソッドを呼べば良いだけです。

確認なのですが、Clickイベントで実行している処理をメソッドで書き直し、KeyDownイベントで呼び出すという認識で宜しいですか。
同じようなコードを書いてしまうような気が...
また、DataGridViewのデータが一覧処理に必要なのですが、こちらはKeyDownイベントで取得する方法で良いのでしょうか?
今までは、Clickイベントの引数、「object sender, EventArgs e」にて、Clickされた行のデータを取得していたもので...

宜しくお願い致します。
■No28514に返信(talmanさんの記事)
> 確認なのですが、Clickイベントで実行している処理をメソッドで書き直し、KeyDownイベントで呼び出すという認識で宜しいですか。

Click イベントでも KeyDown イベントでも同じように呼び出します。

> 同じようなコードを書いてしまうような気が...

いいえ、抽出したメソッドは複数のコードにはなりません。
そのためのメソッドです。

> また、DataGridViewのデータが一覧処理に必要なのですが、こちらはKeyDownイベントで取得する方法で良いのでしょうか?
> 今までは、Clickイベントの引数、「object sender, EventArgs e」にて、Clickされた行のデータを取得していたもので...

抽出したメソッドに必要な引数を受け取るようにすれば良いだけです。
■No28515に返信(じゃんぬねっとさんの記事)
> ■No28514に返信(talmanさんの記事)

じゃんぬさん、ご回答ありがとうございます。

> いいえ、抽出したメソッドは複数のコードにはなりません。
> そのためのメソッドです。
「抽出したメソッド」とはどのようなことでしょうか?
とても初歩的なことをお聞きしていると思いますが、宜しくお願い致します!
>>いいえ、抽出したメソッドは複数のコードにはなりません。
>>そのためのメソッドです。
> 「抽出したメソッド」とはどのようなことでしょうか?
> とても初歩的なことをお聞きしていると思いますが、宜しくお願い致します!
>
例えば、初期投稿のプログラムを↓のように書き換えます。(メソッド名は適当なものに変更してください。)

private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
MakeList();
}
}

private void dvgRequestNoList_cellClick(object sender, EventArgs e)
{
MakeList();
}

private void MakeList()
{
//一覧を作成する処理
}

※元プログラムで書かれていた「//一覧を作成する処理」はsenderとかeの情報って使っていますか?使っているようならMakeListに必要な情報の引き数を付けてください。
■No28517に返信(GODさんの記事)
> >>いいえ、抽出したメソッドは複数のコードにはなりません。
> >>そのためのメソッドです。
>>「抽出したメソッド」とはどのようなことでしょうか?
>>とても初歩的なことをお聞きしていると思いますが、宜しくお願い致します!
> >
> 例えば、初期投稿のプログラムを↓のように書き換えます。(メソッド名は適当なものに変更してください。)
>
> private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
> {
> if (e.KeyCode == Keys.Enter)
> {
> MakeList();
> }
> }
>
> private void dvgRequestNoList_cellClick(object sender, EventArgs e)
> {
> MakeList();
> }
>
> private void MakeList()
> {
> //一覧を作成する処理
> }
>
> ※元プログラムで書かれていた「//一覧を作成する処理」はsenderとかeの情報って使っていますか?使っているようならMakeListに必要な情報の引き数を付けてください。


GODさん、ご回答ありがとうございます。

上記の方法で、メソッドを追加し、各イベントで呼び出しをするようにしてみます。
また、KeyDown、Clickイベントで同一の処理を行う場合は、メソッドを作成して同一の処理を行う方法が一般的なのでしょうか?
もし他のやり方などがあれば、アドバイス頂けたらと思っております。
以上、宜しくお願い致します。
> もし他のやり方などがあれば、アドバイス頂けたらと思っております。
> 以上、宜しくお願い致します。
>
private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
dvgRequestNoList_cellClick(sender, new EventArgs());
}
}
にしても動作はしますが、個人的にはあまりお勧めしたくないですね。
(引き数値はいい加減な値を渡しても型さえ合っていれば呼び出しは可能です。)
例.変更点:「e -> new EventArgs()」または「e -> null」
■No28519に返信(GODさんの記事)
>>もし他のやり方などがあれば、アドバイス頂けたらと思っております。
>>以上、宜しくお願い致します。
>>
> private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
> {
> if (e.KeyCode == Keys.Enter)
> {
> dvgRequestNoList_cellClick(sender, new EventArgs());
> }
> }
> にしても動作はしますが、個人的にはあまりお勧めしたくないですね。
> (引き数値はいい加減な値を渡しても型さえ合っていれば呼び出しは可能です。)
> 例.変更点:「e -> new EventArgs()」または「e -> null」

GODさん、ご回答ありがとうございます。

教えて頂いたことを参考にし、実装を行ってみたいと思います。
完了しましたら、フィードバックさせて頂きます。
以上、宜しくお願い致します。
■No28520に返信(talmanさんの記事)
> ■No28519に返信(GODさんの記事)
> >>もし他のやり方などがあれば、アドバイス頂けたらと思っております。
> >>以上、宜しくお願い致します。
> >>
>>private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
>>{
>>if (e.KeyCode == Keys.Enter)
>>{
>>dvgRequestNoList_cellClick(sender, new EventArgs());
>>}
>>}
>>にしても動作はしますが、個人的にはあまりお勧めしたくないですね。
>>(引き数値はいい加減な値を渡しても型さえ合っていれば呼び出しは可能です。)
>>例.変更点:「e -> new EventArgs()」または「e -> null」
>
> GODさん、ご回答ありがとうございます。
>
> 教えて頂いたことを参考にし、実装を行ってみたいと思います。
> 完了しましたら、フィードバックさせて頂きます。
> 以上、宜しくお願い致します。
>
お疲れ様です。
大変遅くなりましたが、問題が解決しました。

Enterボタンを押下時、DataGridViewのプロパティがsenderにて取得できないのが問題でしたが、以下のようにして、プロパティをパラメータにてClickイベントに渡すことが出来ました。
private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
dvgRequestNoList_cellClick(this.dataGridView1, e);
}
}

画面の初期表示時に、this.dataGridView1がすでに作成されていたので、それを渡せば良かったとのことです。

GODさん、じゃんぬさん、ご回答ありがとうございました。
また宜しくお願い致します。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板