C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: ListBoxに追加したクラスのToString更新させたい


(過去ログ 104 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■62412 / inTopicNo.1)  ListBoxに追加したクラスのToString更新させたい
  
□投稿者/ やんまー (115回)-(2011/10/08(Sat) 01:02:58)

分類:[VB.NET/VB2005 以降] 

ListBoxにクラスをaddすると、ToString()が表示に使われるとわかりましたが
その表示を更新させる方法がわかりません。。。


Class testclass
public name as String
Public Overrides Function ToString() As String
Return name
End Function
End Class



そこで↓こんなふうにTextBoxの内容をセットします。


Sub Button1Click(sender As Object, e As EventArgs)
Dim a As New testclass
a.name = textBox1.Text
listBox1.Items.Add(a)
End Sub



しかし、これを更新したいのですが、上手くできないのです。。。
↓インデックス0を更新してます。

Sub Button3Click(sender As Object, e As EventArgs)
Dim c As testclass = listBox1.Items(0)
c.name = textBox1.Text
End Sub


上手く更新できていないのかと、
↓こんな感じで確認してみるとちゃんとアップデートできていることが確認できます。

Sub ListBox1SelectedIndexChanged(sender As Object, e As EventArgs)
Dim b As testclass = listBox1.SelectedItem
Debug.Print( b.name )
End Sub



で、refreshしたらどうかと思い

Sub
Button4Click(sender As Object, e As EventArgs)
listBox1.Refresh
End Sub


としてみても全く変化せず・・・



最後に、ええーーー、と思ったのですが、このRefreshをCheckedListBoxでやるとちゃんと表示が更新されました・・・



ListBoxの表示を更新させるにはどうしたらよいのでしょうか・・・
引用返信 編集キー/
■62413 / inTopicNo.2)  Re[1]: ListBoxに追加したクラスのToString更新させたい
□投稿者/ NF64 (2回)-(2011/10/08(Sat) 01:48:03)
No62412 (やんまー さん) に返信

確かに仰る通りの状態になりますね。初めて知りました。
削除してから追加し直す、という方法ではだめでしょうか。

Sub Button3Click(sender As Object, e As EventArgs)
    Dim c As testclass = ListBox1.Items(0)
    ListBox1.Items.Remove(c)
    c.name = TextBox1.Text
    ListBox1.Items.Insert(0, c)
End Sub

引用返信 編集キー/
■62416 / inTopicNo.3)  Re[2]: ListBoxに追加したクラスのToString更新させたい
□投稿者/ もぶ (1回)-(2011/10/08(Sat) 11:13:45)
No62413 (NF64 さん) に返信
削除/挿入をしなくても、もう一度セットしなおせば大丈夫でした。

Dim temp As testclass = DirectCast(Me.ListBox1.Items.Item(0), testclass)
temp.name = "456"
Me.ListBox1.Items.Item(0) = temp


クラスの方で自身を返すメソッドを作っておくとか。
あまり意味が無い気もしますけど・・・、とりあえず
Class testclass
...
    Public Function func(ByVal str As String) As testclass
        Me.name = str
        Return Me
    End Function
...
End Class

Dim index As Integer = 0
ListBox1.Items.Item(index) = DirectCast(ListBox1.Items.Item(index), testclass).func("456")

引用返信 編集キー/
■62418 / inTopicNo.4)  Re[1]: ListBoxに追加したクラスのToString更新させたい
□投稿者/ 魔界の仮面弁士 (2387回)-(2011/10/08(Sat) 15:03:55)
No62412 (やんまー さん) に返信
> ListBoxにクラスをaddすると、ToString()が表示に使われるとわかりましたが
> その表示を更新させる方法がわかりません。。。

バインドした項目の内容が変化した際に、データソースを再セットせずに
変更結果を反映させるには、「変更通知」が必要となります。
http://msdn.microsoft.com/ja-jp/library/xz45s2bh%28VS.80%29.aspx
引用返信 編集キー/
■62426 / inTopicNo.5)  Re[2]: ListBoxに追加したクラスのToString更新させたい
□投稿者/ やんまー (116回)-(2011/10/09(Sun) 01:36:51)
NF64 さん

回答有難う御座います。

		For i As Integer = 0 To listBox1.Items.Count - 1
			dim b As testclass = listBox1.Items( i )
			ListBox1.Items.Remove(b)
			ListBox1.Items.Insert(i, b)
			Debug.Print( i )
		Next

として見ました。

上手く行ったように見えます!

引用返信 編集キー/
■62427 / inTopicNo.6)  Re[3]: ListBoxに追加したクラスのToString更新させたい
□投稿者/ やんまー (117回)-(2011/10/09(Sun) 01:46:58)
もぶ さん

ありがとうございます!


> Dim temp As testclass = DirectCast(Me.ListBox1.Items.Item(0), testclass)
> temp.name = "456"
> Me.ListBox1.Items.Item(0) = temp
>
>

For i As Integer = 0 To listBox1.Items.Count - 1
Dim temp As testclass = DirectCast(Me.ListBox1.Items.Item(i), testclass)
Me.ListBox1.Items.Item(i) = temp

Next


で、うまくいきました!




> クラスの方で自身を返すメソッドを作っておくとか。
> あまり意味が無い気もしますけど・・・、とりあえず
> Class testclass
> ...
> Public Function func(ByVal str As String) As testclass
> Me.name = str
> Return Me
> End Function
> ...
> End Class
>
> Dim index As Integer = 0
> ListBox1.Items.Item(index) = DirectCast(ListBox1.Items.Item(index), testclass).func("456")


こちらもバッチリ!

Dim index As Integer = 0
ListBox1.Items.Item(index) = DirectCast(ListBox1.Items.Item(index), testclass).func(textBox1.Text)


セットして即表示が変わることを確認できました!


引用返信 編集キー/
■62428 / inTopicNo.7)  Re[2]: ListBoxに追加したクラスのToString更新させたい
□投稿者/ やんまー (118回)-(2011/10/09(Sun) 01:48:28)
2011/10/21(Fri) 19:31:49 編集(投稿者)

No62418 (魔界の仮面弁士 さん) に返信
> ■No62412 (やんまー さん) に返信
>>ListBoxにクラスをaddすると、ToString()が表示に使われるとわかりましたが
>>その表示を更新させる方法がわかりません。。。
>
> バインドした項目の内容が変化した際に、データソースを再セットせずに
> 変更結果を反映させるには、「変更通知」が必要となります。
> http://msdn.microsoft.com/ja-jp/library/xz45s2bh%28VS.80%29.aspx


いつもありがとうございます!

何やら難しそうですね・・・

とりあえず、サンプルのようにしてみようと思ったのですが、
コンパイルエラーが出まくって挫折してしまいました・・・

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -