tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルCheckedListBoxにチェックをつけたい
記事No3467
投稿日: 2006/04/03(Mon) 15:21
投稿者ひろ
[OSのVer]:WindowsXp   [VBのVer]:VB.NET2003

CheckedListBoxに複数のデータを表示しており、
任意のデータに対して、プログラムからチェックを付けたいと考えています。

サンプルを作りました。

新しいウィンドウズアプリケーションを開いて、
フォームにCheckedListBox 1つと Button を1つ貼り付けます。
モジュールを追加して Sub Mainからスタートするようにします。

(モジュール側)
    Sub Main()

        Dim frmTgt As New Form1
        Dim dtTest As New DataTable

        dtTest.Columns.AddRange(New DataColumn() {New DataColumn("Code", GetType(String)), _
                                                  New DataColumn("Name", GetType(String))})

        dtTest.Rows.Add(New Object() {"001", "あいうえお"})
        dtTest.Rows.Add(New Object() {"002", "かきくけこ"})
        dtTest.Rows.Add(New Object() {"003", "さしすせそ"})
        dtTest.Rows.Add(New Object() {"004", "たちつてと"})
        dtTest.Rows.Add(New Object() {"005", "なにぬねの"})

        With frmTgt.CheckedListBox1
            .CheckOnClick = True
            .DisplayMember = "Name"
            .ValueMember = "Code"
            .DataSource = dtTest
            .SetItemChecked(3, True)
        End With

        Application.Run(frmTgt)

        frmTgt.Dispose()

    End Sub

(フォーム側)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
        Me.CheckedListBox1.SetItemChecked(3, True)
    End Sub

フォームのボタンを押下すれば「たちつてと」の行にチェックがつくのですが、
フォームが表示されるタイミングではチェックがついていません。

Sub Mainの中の SetItemChecked が動いてほしいのですが、
何か方法はありますか?

[ツリー表示へ]
タイトルRe: CheckedListBoxにチェックをつけたい
記事No3468
投稿日: 2006/04/03(Mon) 19:27
投稿者るしぇ
初期化関連の処理がいつ実行されているか?デバッグすると、
InitializeComponent は New のときだけど、Load イベントは
>Application.Run(frmTgt)
の時というのが分かります。

同じコードを Load イベントに書くとチェックが付くので、
Load イベントの後でないとチェックが付かないのだろう…と
いう予想が付きます。

フォーカスとかも Load イベントの後でないとフォームが受け取れ
ないって現象があるんですが、フォーカスを受け取れないのは
納得いかなくもないものの、こちらもなぜか同じことが起こってる
みたいですね。普通、プロパティを変更してチェックするのに、
メソッドになってるところを見ると、その辺の処理が特殊なんでしょう。

設定前に
        frmTgt.Show()
して Load イベントを起こしてやればチェックが付くことが確認
できました。…しかし、不細工なコードなので、フォーム側に
Sub Main からデータを渡しておいて、フォームが Load イベント
の時に、もらったデータに合わせて自分で設定するような設計の
方が良いのでは?

[ツリー表示へ]
タイトルRe^2: CheckedListBoxにチェックをつけたい
記事No3469
投稿日: 2006/04/04(Tue) 10:27
投稿者ひろ
るしぇさん有難うございます。

まさかSetFocusとかと同じパターンだとは想像もつきませんでした。
今回載せたのはサンプルのソースなので、呼び元から呼び先のプロパティを直接操作していますが、
実際のソースは親フォームから子フォームを呼び出す時にプロパティとしてセットしています。
るしぇさんの解決策を使用させてもらおうと思います。
プロパティセット時は値の保持だけにしてLoadイベントでチェックをつけようと思います。

[ツリー表示へ]