- PR -

ListViewの選択行が移動しない

1
投稿者投稿内容
じょん
会議室デビュー日: 2004/06/16
投稿数: 8
お住まい・勤務地: 兵庫県
投稿日時: 2007-06-01 19:48
こんにちは。

キーボードからの入力でリストビューの選択行の移動をさせたいのですが、
スペースキーでのイベント時のみ移動しません。

「 A 」や「 Enter 」の入力では次の行に移動します。

どうすれば、スペースキーで次行に移動させることが出来るでしょうか。

よろしくお願いします。


環境:VisualStadio2005 SP1

public Form1()
{
InitializeComponent();

listView1.View = View.Details;
listView1.HideSelection = false;
listView1.MultiSelect = false;

listView1.Columns.Add( "見出し" );

listView1.Items.Add( "Test1" );
listView1.Items.Add( "Test2" );
listView1.Items.Add( "Test3" );

}

private void listView1_KeyDown( object sender, KeyEventArgs e )
{
int nextIndex = listView1.SelectedItems[ 0 ].Index + 1;

switch( e.KeyCode )
{

// 移動しない
case Keys.Space:
listView1.Items[ nextIndex ].Selected = true;
break;

// 移動する
case Keys.A:
listView1.Items[ nextIndex ].Selected = true;
break;

// 移動する
case Keys.Enter:
listView1.Items[ nextIndex ].Selected = true;
break;

}
}
}
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-06-01 19:58
引用:

じょんさんの書き込み (2007-06-01 19:48) より:

キーボードからの入力でリストビューの選択行の移動をさせたいのですが、スペースキーでのイベント時のみ移動しません。


スペース キーの場合は、Node を展開する役割があるからではないでしょうか。
KeyDown イベントよりもっと上のメソッドで横取りしないと意図したとおりに動かないかもしれません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-06-02 02:27
引用:

じゃんぬねっとさんの書き込み (2007-06-01 19:58) より:
引用:

じょんさんの書き込み (2007-06-01 19:48) より:
キーボードからの入力でリストビューの選択行の移動をさせたいのですが、スペースキーでのイベント時のみ移動しません。


スペース キーの場合は、Node を展開する役割があるからではないでしょうか。
KeyDown イベントよりもっと上のメソッドで横取りしないと意図したとおりに動かないかもしれません。



SelectedとFocus、ほかにいくつかの内部状態によって振る舞いが変わります。
ViewやMultiselect、HideSelectionなどによっていろいろ変わるので、
全ての場合については把握しきれていませんが、
MultiSelect=FalseのListViewの場合、
Focusも設定すれば大体うまくうごきます。

コード:

case Keys.Space: 
listView1.Items[ nextIndex ].Selected = true; 
listView1.Items[ nextIndex ].Focused = true; 
break;

case Keys.A: 
listView1.Items[ nextIndex ].Selected = true; 
listView1.Items[ nextIndex ].Focused = true; 
break; 

case Keys.Enter: 
listView1.Items[ nextIndex ].Selected = true; 
listView1.Items[ nextIndex ].Focused = true; 
break; 




他のキー(AやEnter)についてもFocusedをセットしておいたほうが
問題なく動作すると思います。
じょん
会議室デビュー日: 2004/06/16
投稿数: 8
お住まい・勤務地: 兵庫県
投稿日時: 2007-06-02 23:40
じゃんぬねっとさん、れいさん返答ありがとうございます。

れいさんのアドバイスどおり、移動後の行に「 .Focused = true 」することで、
スペースキーでも移動が確定すようようになりました。

ヘルプやサンプルなどでも「 ListView1.Focus(); 」となっていたので、
リストビュー自体にはフォーカスを移動させていたのですが、
まさか、行にフォーカスさせないといけないとは思いませんでした。

大変勉強になりました。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)