TreeViewのCheckBoxについて

このQ&Aのポイント
  • Visual Studio 2005で開発している環境で、TreeViewにCheckBoxを表示させて親ノードのCheckBoxをクリックすると子ノードのCheckBoxも一括で操作したいと考えています。
  • 通常のCheckBoxと異なり、TreeViewのCheckBoxにはクリックイベントが存在しないため、AfterCheckイベントを使う方法を試しましたが、コンパイルエラーが発生しました。
  • バージョンアップができないため、CheckBoxクリック時のイベントの拾い方について、教えていただけると助かります。
回答を見る
  • ベストアンサー

TreeViewのCheckBoxについて

はじめまして。 以下の環境で開発しています。 Visual studio 2005 Version 8.0.50727.867 (vsvista.050727-8600) .NET Framework Version 2.0.50727 SP2 Visual Basic 2005 TreeView(二階層限定)にCheckBoxを表示させて親ノードのCheckBoxをTrue/Falseすると その子ノードのCheckBoxも全部合わせてTrue/Falseするものを作ろうとしていますが、 CheckBoxクリック時のイベントが拾えません。 どなたかご存知の方がおられましたらご教授ください。 通常のCheckBoxであればPostBackが発生するのですが、TreeViewのCheckBoxにはそのような イベントがありません。 TreeNodeCheckChangedイベントはあるのですが、True/Falseが切り替わったあとにTreeView のラベル選択したときに発生する中途半端なイベントなので使えません。 http://msdn.microsoft.com/ja-jp/library/system.windows.forms.treeview.aftercheck(VS.80).aspx のヘルプからAfterCheckイベントを調べて試したのですが、 Imports System.Windows.Forms Public Event AfterCheck As TreeViewEventHandler を定義して、以下の関数を書いてみたのですが、 Private Sub node_AfterCheck(ByVal sender As Object, ByVal e As TreeViewEventArgs) Handles TreeView1.AfterCheck ~中身~ End Sub 「イベントAfterCheckが見つかりません。」とコンパイルエラーとなります。 客先の開発環境なのでバージョンアップ等はできません。 どなたかCheckBoxクリック時のイベントの拾い方をご存知の方がおられましたらご教授お願いします。

  • OU813
  • お礼率100% (2/2)

質問者が選んだベストアンサー

  • ベストアンサー
  • sean9
  • ベストアンサー率86% (26/30)
回答No.2

No.1のsean9です。 ちゃんと読んでいればWebコントロールだとわかりますね・・・早とちりしてすみません。 では本題に。 以下のjavascriptでどうでしょう。 TreeView1_TreeNodeCheckChanged内で子ノードのチェック処理します。 <script type="text/javascript"> function fire() { var element = window.event.srcElement; var id = event.srcElement.id; id = id.replace("TreeView1t", "TreeView1n"); id = id.replace("CheckBox", ""); var ch = document.getElementById(id); if (ch != null && element.tagName == "INPUT" && element.type == "checkbox") { __doPostBack("", ""); } } </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:TreeView ID="TreeView1" runat="server" ShowCheckBoxes="All"> <Nodes> <asp:TreeNode Text="node1" > <asp:TreeNode Text="childNode1" /> <asp:TreeNode Text="childNode2" /> </asp:TreeNode> </Nodes> </asp:TreeView> </div> </form> <script type="text/javascript"> if (document.all) { document.getElementById('TreeView1').onclick = fire; } </script> </body> </html>

OU813
質問者

お礼

sean9様 ありがとうございます! 早速試したところ、無事postbackされました! これで子ノードにチェックを入れる以外の動きもできそうです。 助かりました!!

その他の回答 (1)

  • sean9
  • ベストアンサー率86% (26/30)
回答No.1

こんにちは。普段C#ばかりでVisualBasicで書いたことがないので、書き方が的確ではないかも知れませんが大目に見てください。 TreeViewのAfterCheckを使います。 (1)イベントハンドラの追加 AddHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck (2)イベントハンドラでの処理 Private Sub TreeView1_AfterCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Dim treeNode As TreeNode treeNode = e.Node If e.Action <> TreeViewAction.Unknown Then Dim activeNode As TreeNode activeNode = e.Node For Each node As TreeNode In activeNode.Nodes node.Checked = activeNode.Checked Next End If End Sub こういうことでしょうか。

OU813
質問者

お礼

sean9様 ご回答ありがとうございます。 FormではAfterCheckイベントハンドラを追加できるようなのですが、今やろうとしているWebのコントロールにはAfterCheckイベントがありませんでした。 試してみたのですがやはり構文エラーとなりました… WebコントロールでAfterCheckができないかな~と思っています。 質問の方にWebコントロールと書いていなくて申し訳ありませんm(_ _)m

関連するQ&A

  • CheckBoxのコントロール配列について

    VB2008を使用しています。 True状態のCheckBox1~70をButtonを押すことによってFalse状態にさせようとしていますが、一つずつコードを記載するのは長くなってしまうため以前こちらに投稿されていたTextBoxのコントロール配列を参考に下記のコードを作成しました。 Dim c As Integer For c = 1 To 70 Me.Controls("CheckBox" & c.ToString).Checked = False Next しかし、このコードでは下記のエラーが出てしまいます。 "CheckedはSystem.Windows.Forms.Controlのメンバではありません。" どなたかお知恵をお貸し下さい。

  • CheckBoxがTrueの場合に表示をさせるには?

    VB2008を使用しています。 3つのCheckBox1~3とそれに対応した3つのTextBox1~3を準備し、 Buttonを押すとCheckBoxがTrueのものだけをRichTextBox1に表示 させたくて下記のプログラムを作成しました。 しかしCheckBox1とCheckBox3については上手く作動するのですが CheckBox2について不具合が発生します。 (不具合) CheckBox1=TrueでButtonを押すとRichTextBox1にTextBox1を表示。 その後、CheckBox3=TrueでButtonを押すとRichTextBox1にTextBox1. TextBox3と表示。 ここまでは良いのですが、 CheckBox2=TrueでButtonを押すとRichTextBox1にTextBox2を表示。 その後、CheckBox3=TrueでButtonを押すとRichTextBox1にTextBox2. TextBox2.TextBox3と表示されてしまいTextBox2の内容が重複して しまいまいます。 何か良い解決策がありましたら教えて下さい。 よろしくお願いいたします。 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click     If Me.CheckBox1.Checked = True Then RichTextBox1.Text = TextBox1.Text End If     If Me.CheckBox2.Checked = True Then If RichTextBox1.Text <> "" Then RichTextBox1.Text = RichTextBox1.Text & "."     End If RichTextBox1.Text = RichTextBox1.Text & TextBox2.Text     End If If Me.CheckBox3.Checked = True Then If RichTextBox1.Text <> "" Then RichTextBox1.Text = RichTextBox1.Text & "." End If RichTextBox1.Text = RichTextBox1.Text & TextBox3.Text End If End Sub

  • ドラッグドロップ(AllowDrop)について

    Form1にドラッグドロップ機能を導入しようと思い AllowDropプロパティをTrueにしてDragDropイベントとDragEnterイベントを記述しました。 実際にデバックしてみるとうまく機能して安心したのですが 後で、bin/debug/AAA.exeを直接クリックしてみるとなぜか機能しません。 MyBase.LoadイベントにMyBase.AllowDrop=Trueと記述してみたいのですがダメでした。 何か設定が間違ってるのでしょうか? ぜひご回答お願いします。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load   MyBase.AllowDrop = True End Sub Private Sub drag_drop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop   Dim list As String() = CType(e.Data.GetData(DataFormats.FileDrop, False), String())   For Each a In list      MsgBox(a)   Next End Sub Private Sub drag_enter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragEnter   e.Effect = DragDropEffects.Copy End Sub

  • ToolStripMenuItemのクリックイベントからTreeViewのノードを取得したい

    C#3.5を使用しています。 TreeViewのContestMenuStripのToolStripMenuItemをクリックしたときに どの(複数のノードに同じContestMenuStripをセットしています)TreeViewのノードからのToolStripMenuItemが クリックされたかを知るためにEventArgs e からTreeViewの選択されてるノードが取得したいのですが、 どうすれば良いのでしょうか? private void itemAddToolStripMenuItem_Click(object sender, EventArgs e) { var ev = (System.Windows.Forms.ToolStripItemEventArgs)e;// ToolStripItemEventArgsにキャストすればよいかと思ったのですがエラーになります・・・ }

  • TreeViewのスクロール制御

    VB6でTreeViewコントロールのスクロールをプログラム側から制御する物を作っているのですが分からなくて困っています。 TreeViewでNodeが増えれば自動的に表示されるスクロールバーは表示をしないように「Scrollプロバティ」にFalseを入力してSendMessageで下記の方法で行ったのですがスクロールしません。 Private Sub Command1_Click() Call SendMessage(TreeView1.hwnd, WM_VSCROLL, MAKEWPARAM(SB_THUMBPOSITION, sPos), 0) End Sub Private Function MAKEWPARAM(LOWWORD As Long, HIWORD As Long) As Long MAKEWPARAM = (LOWWORD And &HFFFF&) Or (HIWORD * &H10000) End Function 「Scrollプロパティ」にTrueを設定すると問題なくできるのですが、どなたか分かる方がいましたら宜しくお願い致します。

  • D&Dでファイルパスを取得

    フォームにD&Dでファイルパスを取得する プログラムを作ろうと思っているのですが、うまくいきません。 ファイルをフォームにドラッグしても禁止マークがでて イベントハンドラがイベントをキャッチしてくれないようです。 なにが問題かアドバイスを頂けないでしょうか? よろしくお願いします。 Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.AllowDrop = True End Sub Private Sub Form1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragEnter If e.Data.GetDataPresent(DataFormats.FileDrop) Then e.Effect = DragDropEffects.Copy End If End Sub Private Sub Form1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop Dim FileName As String FileName = e.Data.GetData(DataFormats.FileDrop)(0) MsgBox(FileName) End Sub End Class ---- 開発環境:VS2005 pro OS:WindowsVista

  • VBでデバックするとエラーになる。

    VBでデバックすると下のようなエラーがでます ArgumentNullExceptionはハンドルされませんでした。 値を Null にすることはできません。 パラメーター名: activationContext VBを初めて日が浅いのでヘルプを読んでも意味が理解できませんでした。 なので、易しく回答してもらえると嬉しいです コードは下です Public Class Form1 'TextBox2に入力したURLをWebBrowser1で表示する Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click WebBrowser1.Navigate(TextBox2.Text) End Sub 'ブラウザ→戻るでWebBrowser1を処理する Private Sub 戻るToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 戻るToolStripMenuItem.Click WebBrowser1.GoBack() End Sub 'ブラウザ→進むでWebBrowser1を処理する Private Sub 進むToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 進むToolStripMenuItem.Click WebBrowser1.GoForward() End Sub 'ブラウザ→テキストボックスにURLを入力した時の処理 Private Sub ToolStripTextBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripTextBox1.Click WebBrowser1.Navigate(ToolStripTextBox1.Text) End Sub 'TextPageのタブをクリックした時のイベント Private Sub TabPage1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabPage1.Enter TextBox2.Visible = False Button1.Visible = False ブラウザToolStripMenuItem.Enabled = False 書式ToolStripMenuItem.Enabled = True ToolStripMenuItem1.Enabled = True End Sub 'BrowserPageのタブをクリックした時のイベント Private Sub TabPage2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabPage2.Enter TextBox2.Visible = True Button1.Visible = True ブラウザToolStripMenuItem.Enabled = True 書式ToolStripMenuItem.Enabled = False ToolStripMenuItem1.Enabled = False End Sub Private Sub 新規ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 新規ToolStripMenuItem.Click TextBox1.Text = ("") End Sub Private Sub 開くToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 開くToolStripMenuItem.Click Dim selectButton As DialogResult Dim filename As String selectButton = OpenFileDialog1.ShowDialog() filename = OpenFileDialog1.FileName If selectButton = DialogResult.OK Then Try TextBox1.Text = _ My.Computer.FileSystem.ReadAllText(filename, System.Text.Encoding.Default) Me.Text = "Visual Text" & filename Catch ex As Exception End Try End If End Sub Private Sub 保存ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 保存ToolStripMenuItem.Click Dim selectButton As DialogResult Dim filename As String selectButton = SaveFileDialog1.ShowDialog() filename = SaveFileDialog1.FileName If selectButton = DialogResult.OK Then Try My.Computer.FileSystem.WriteAllText(filename, TextBox1.Text, False, System.Text.Encoding.Default) Me.Text = "Visual Text" & filename Catch ex As Exception End Try End If End Sub Private Sub フォントToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles フォントToolStripMenuItem.Click Dim fd As New FontDialog() fd.Font = TextBox1.Font fd.Color = TextBox1.ForeColor fd.MaxSize = 19 fd.MinSize = 8 fd.FontMustExist = True fd.AllowVerticalFonts = False fd.ShowColor = True fd.ShowEffects = True fd.FixedPitchOnly = False fd.AllowVectorFonts = True If fd.ShowDialog() <> DialogResult.Cancel Then 'TextBox1のフォントと色を変える TextBox1.Font = fd.Font TextBox1.ForeColor = fd.Color End If End Sub End Class

  • if文からcase文への置き換え

    ピクチャボックスをクリックしたら、チェック ボックスがチェックされるメソッドを作りたいと 思っています。 Private Sub PictureBox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click,PictureBox2.Click 'ここから If sender Is PictureBox1 Then If Me.CheckBox1.Checked = False Then Me.CheckBox1.Checked = True Else Me.CheckBox1.Checked = False End If ElseIf sender Is PictureBox2 Then If Me.CheckBox2.Checked = False Then Me.CheckBox2.Checked = True Else Me.CheckBox2.Checked = False End If End If 'ここまで End Sub 上記のif文をCase文に置き換えたくて、 'ここから Select Case sender Case PictureBox1 If Me.CheckBox1.Checked = False Then Me.CheckBox1.Checked = True Else Me.CheckBox1.Checked = False End If Case PictureBox2 If Me.CheckBox2.Checked = False Then Me.CheckBox2.Checked = True Else Me.CheckBox2.Checked = False End If End Select 'ここまで 上記のように書き換えたのですが、エラーが出てしまいます(ビルドは通るのですが)。 Case文の使い方が間違っているんだとは思いますが、どこがどう 間違っているのがよくわかりません。 ご教授いただけないでしょうか?

  • 参照型の比較方法で質問

    いつもお世話になっております。 VB.NET で型名の比較について2点質問です。 フォームの初期化の場合に下記のようなコードで コントロールに応じた初期化処理をしているのですが、 わざわざ文字列にしてそれを比較するのも余りスマートで ないように見えまして、もう少しスマートな比較方法が ないのかなと思うのですが、良い方法あるでしょうか? Dim ctrl As System.Windows.Forms.Control For Each ctrl In Me.Controls Select Case ctrl.GetType().ToString Case "System.Windows.Forms.TextBox" ctrl.Text = "" Case "System.Windows.Forms.ComboBox" ctrl.Text = "" CType(ctrl, System.Windows.Forms.ComboBox).Items.Clear() Case "System.Windows.Forms.DateTimePicker" CType(ctrl, System.Windows.Forms.DateTimePicker).Value = Now Case "System.Windows.Forms.CheckBox" CType(ctrl, System.Windows.Forms.CheckBox).Checked = False End Select Next 第二点は以下のようなイベントハンドラを考えるとして、sender には System.Windows.Forms.Control の派生クラス(TextBox, CheckBoxなど)への参照が 渡されてくる予定のですが、渡されたものが本当にControlクラスの派生クラスなのか を関数内で確認したいのです。どのようにしたら良いですか? Private Sub Controls_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs)

  • Visual Basic 合計がうまく出せません。

    Visual Basicを習い始めたばかりですので、コードが分かり難くてすみません。チェックボックスとラジオボタンを使って合計等を出したいのですが、下のコードだとTax、Subtotal、Totalが0になってしまいます。各々のチェックボックスとラジオボタンに下のコードを入れてから、合計等が0になってしまいました。その前は、きちんと計算は出来ていたのですが。ご教授宜しくお願いいたします。 ---------------------- Private Sub Checkbox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Checkbox1.CheckedChanged Dim checkbox1 As Double = 450.40 Dim checkbox2 As Double = 871.65 Dim checkbox3 As Double = 1860.56 Dim radiobutton1 As Integer = 0 Dim radiobutton2 As Double = 250.45 Dim radiobutton3 As Double = 674.24 Dim sum As Double If checkbox1.Checked = True Then sum += checkbox1 End If If checkbox2.Checked = True Then sum += checkbox2 End If If checkbox3.Checked = True Then sum += checkbox3 End If If radiobutton1.Checked = True Then sum += radiobutton1 End If If radiobutton2.Checked = True Then sum += radiobutton2 End If If radiobutton3.Checked = True Then sum += radiobutton3 End If txtSum.Text = FormatCurrency(sum) End Sub ---------------------------- Private Sub btnCalculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalculate.Click Dim Car As Double Dim Tax As Double Dim Sum As Double txtTax.Text = Format((Car + Sum) * (0.12), "$######.##") ‘Taxの計算 txtSubtotal.Text = Format(Car + Sum + Tax, "$######.##") ‘Subtotalの計算 Dim Subtotal As Double Dim Trade As Double txtTotal.Text = Format(Subtotal + Tax, "$######.##")  ‘合計の計算 End Sub -----------------------

専門家に質問してみよう