- PR -

TABキーでのフォーカス移動について

1
投稿者投稿内容
さくら
ベテラン
会議室デビュー日: 2004/02/12
投稿数: 76
投稿日時: 2005-01-07 22:44
現在、VB.NETでWindowsアプリを開発しています。

Enterキーが押されたときに、TABキーと同様の動作をさせて
TabIndex順にフォーカスを移動させる処理を作成中なのですが、
フォーカスがテキストボックスに移動したとき、
もしそのテキストボックスに何か文字が入っていたら
その文字列がすべて選択状態(反転表示)になります。
望んでいることは、もしテキストボックスにフォーカスが
移動したときは、テキストボックスに入っている文字列の
一番最後にカーソルがある状態にしたいのです。
これを実現する方法を探しているのですが、
どうしても文字列すべてが選択状態(反転表示)になってしまい、
回避策が見つかりません…。

もし、何かアドバイス等がありましたら
ぜひご教授くださいますようお願い致します。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-01-08 01:13
TextBoxのGotFocusイベントかなんかで、TextBox.Select(int,int)メソッドで
文字列の最後尾を0文字分選択する、ようにすればいいと思います。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformstextboxbaseclassselecttopic1.asp
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-01-08 09:01
諸農です。

既にコメントがありますが、同じような方法をもう一つ。

コード:

private void myEnter(object  sender, System.EventArgs e)
{
    TextBox tb = sender as TextBox;
    if (tb != null) tb.SelectionStart = tb.Text.Length;
}



この処理を対象のTextBoxのEnterイベントにセットします。

コード:

foreach(Control c in this.Controls)
{
    if (c is TextBox) ((TextBox)c).Enter += new EventHandler(myEnter);
}



このコードでは記述していませんが、コントロールはコンテナコントロール上で
ネストしている場合もあるのでその対処は忘れずにしてください。


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
てっちゃん
会議室デビュー日: 2005/01/09
投稿数: 14
投稿日時: 2005-01-09 23:59
Jscript1.jsとして次のプログラムをHTMLに<script language="jscript" src="JScript1.js"></script>と埋め込むとうまくいきます。ある本に載っていました
忘れましたけど。

document.onkeydown = new Function("ConvertToTabFromEnter();");
function ConvertToTabFromEnter()
{
if(event.keyCode == 13)
{
if(event.srcElement.type == null)
{
event.returnValue = false;
}
if(event.srcElement.type == "text"
|| event.srcElement.type == "radio"
|| event.srcElement.type == "checkbox"
|| event.srcElement.type == "password"
|| event.srcElement.type == "file"
|| event.srcElement.type == "select-multiple"
|| event.srcElement.type == "select-one"
|| (event.srcElement.type == "textarea"
&& event.srcElement.wrap != "off"))
{
try
{
event.keyCode = 9;
}
catch(e)
{
event.returnValue = false;
}
}
}
}
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-01-10 00:11
引用:

てっちゃんさんの書き込み (2005-01-09 23:59) より:
Jscript1.jsとして次のプログラムをHTMLに<script language="jscript" src="JScript1.js"></script>と埋め込むとうまくいきます。



浅学のため教えていただきたいのですが、
Windowsアプリではどこにどのように埋め込めばいいのでしょうか?

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
てっちゃん
会議室デビュー日: 2005/01/09
投稿数: 14
投稿日時: 2005-01-10 00:48
ごめんなさい。ASP.NETでのWEBアプリケーションの場合でした。
WINDOWSアプリケーションでしたね。下の様にすると
TEXTBOX1でENTERを押すとTEXTBOX2の内容の最後にカーソルが来ると思いますが・・・
どうでしょうか??

Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As   System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
If e.KeyCode = Keys.Enter Then
TextBox2.Focus()
TextBox2.Select(TextBox2.Text.Length, 0)
End If
End Sub
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-01-11 09:40
こんにちは、じゃんぬねっと です。
もう解決してそうですが、ちょっとだけ...。

引用:

現在、VB.NETでWindowsアプリを開発しています。
Enterキーが押されたときに、TABキーと同様の動作をさせて
TabIndex順にフォーカスを移動させる処理を作成中なのですが、
フォーカスがテキストボックスに移動したとき、
もしそのテキストボックスに何か文字が入っていたら
その文字列がすべて選択状態(反転表示)になります。
望んでいることは、もしテキストボックスにフォーカスが
移動したときは、テキストボックスに入っている文字列の
一番最後にカーソルがある状態にしたいのです。
これを実現する方法を探しているのですが、



まず、[Enter] キーによるフォーカス遷移について
http://jeanne.wankuma.com/tips/form/27-cobolerform.html

引用:

どうしても文字列すべてが選択状態(反転表示)になってしまい、
回避策が見つかりません…。



これは、そういう処理がされているわけではなく、前回選択していた範囲が残っているからですね。

引用:

一番最後にカーソルがある状態にしたいのです。



この場合は、こちらの SelectAll の変わりに、
http://jeanne.wankuma.com/tips/textbox/06-onselectall.html

 TextBox1.SelectedStart = TextBox1.Length

とすれば良いだけです。

_________________
じゃんぬ
  @Home  じゃんぬねっと
  @Blog   じゃんぬねっと Blog

[ メッセージ編集済み 編集者: じゃんぬねっと 編集日時 2005-03-15 19:54 ]
さくら
ベテラン
会議室デビュー日: 2004/02/12
投稿数: 76
投稿日時: 2005-01-11 16:51
たくさんのお返事ありがとうございます。
皆様からのアドバイスで望んでいる通りの動作ができました!

コントロール名をベタで記述するのは変更があった場合にツライので、
どのコントロールでEnterキーが押されても
次のTabIndexを持っているコントロールにフォーカスが移動し、
その移動先コントロールにセットされている文字列が
反転表示にならないようにソースを記述しました。
以下にソースを記載します。
本当にありがとうございました!!

--------------------------------------------------------------------
Private Sub myEnter(ByVal sender As Object, ByVal e As System.EventArgs)

Dim tb As TextBox

tb = CType(sender, TextBox)
If IsNothing(tb) = False Then
tb.SelectionStart = tb.Text.Length
End If

End Sub

という関数を1つ作り、
以下のソースをLoadイベントに記述しました。

Dim MyObject As Control
Dim strCtlName As String

For Each MyObject In Me.Controls
If MyObject.ToString = "System.Windows.Forms.TextBox" Then
AddHandler CType(MyObject, TextBox).Enter, AddressOf myEnter
End If
Next

--------------------------------------------------------------------

1

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