投稿者 是木  (社会人) 投稿日時 2009/5/11 10:01:22
返事が大変遅くなり本当に申し訳ありません。

ヴァンさん こんばんわ
「変更のために記入してみる」ということでしょうか?>>>>その通りです。
どの様なエラーでしょうか>>>>該当箇所=
TextBox1.Text = ListBox1.Items(ListBox1.SelectedIndex)
内容=
InvalidArgument=Value of '-1' is not valid for 'index'. Parameter name: index
です。エラーの内容を書き忘れて申し訳ありませんでした。

刈谷さん こんばんわ
>>>ListBox1.Items(ListBox1.SelectedIndex) = TextBox1.Textを実行すると、SelectedIndexChangedが2回流れるようです。
(選択行解除、元の行の再選択)
このときの選択行解除のSelectedIndexChangedでItemsの配列外を指してしまうためにエラーになっています>>>

うーむ。かなり参考になりました。ありがとうございました。
しかし、
僕の質問の仕方が悪かったかもしれないのですが
”TextBoxを、キー入力で更新する度にListBoxの該当項目も更新される”
の意味は、
TextBoxが仮に""の場合は、ListBoxの該当項目も""
TextBoxが仮に"aaaaaaaaaa"の場合は、ListBoxの該当項目も"aaaaaaaaaa"
いけないという意味です。刈谷さんのサンプルは、
TextBoxがListBoxに用意されているアイテムのどれかひとつにも
完全に合致しない場合はListBoxはまったく変更をしないので,。。。
しかし、それはそれで、違う用途で活路のあるプログラムだと思います。

ところで、正攻法ではないと思いますが、刈谷さんのおっしゃられるSelectedIndexChangedの弊害?を
避けるためListBox1_Clickを使ったらどうかと思い試してみたところうまくいきました。
TextBox1.Text = ListBox1.Text は、うまくいくみたいです。
しかしその逆はだめで
ListBox1.Items(ListBox1.SelectedIndex) = TextBox1.Textのところは、やはりそのように書かないと
このケースでは、だめみたいです。
Changedは想定外の時点でもイベントが発生してしまいますので扱いが難しいが
Clickの場合は実際にマウスを人為的に操作した場合だけに反応するので扱いやすいということが
いえるのではないでしょうか。
また、TextBox1_TextChanged とListBox1_SelectedIndexChanged というように
Changedが2つのコントロールで互いに干渉しあう心配も要らなくなるという利点があると思います。


Public Class Form1
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ListBox1.Items.Add("aaa")
        ListBox1.Items.Add("bbb")
        ListBox1.Items.Add("ccc")
        ListBox1.Items.Add("ddd")
        ListBox1.Items.Add("eee")
        ListBox1.SelectedIndex = 0
        TextBox1.Text = ListBox1.Text

    End Sub
    Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        ListBox1.Items(ListBox1.SelectedIndex) = TextBox1.Text
    End Sub
    Private Sub ListBox1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.Click
        TextBox1.Text = ListBox1.Text
        TextBox1.Focus()
    End Sub
End Class