• ベストアンサー

TreeVIewのノード名を編集する際、編集できる文字を制御したい

TreeViewのノードを編集する際、例えば、ノード名の後ろ2文字は編集せない、といったことをやりたいと思っています。 TreeViewのノードにファイル名を表示させています。ノード名が変更されたら、その名前をローカルのファイル名に反映させるつもりです。しかし、ファイル名の後ろ2文字に特別な意味があり、この2文字をユーザに編集させない処理ができないか模索しています。 何かよい方法はないでしょうか? 開発環境 Visual Basic 2008 .NET FrameWord 2.0 Windows XP SP2

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

文字列から最後の2文字を抜くのは BeginEditメソッド呼ぶときの方がいいようです 何かのアクション条件下でBeginEditを使う前に sLast = objNode.Text.SubString( objNode.Text.Length - 2 ) objNode.Text = objNodeText.SubString(0, objNode.Text.Length -2 ) objNode.BeginEdit() といった具合にします # objNodeが編集するノード、変数sLastは最後を覚えておくClassレベルの変数です 編集が終わったときの処理 TreeView1_AfterLabelEdit イベントで if e.Label isnot nothing then   TreeView1.LabelEdit = False   e.Node.EndEdit( False )   e.Node.Text = e.Label & sLast   ' これが無いと ラベルの内容がイベント終了後にe.Labelに戻ってしまう   e.CancelEdit = True else   ' これが無いと編集モードにならない …   e.Node.BeginEdit() end if といった具合でよさそうです BeforeLabelEdit側での処理は複数回呼ばれてしまうのでうまくないようです ただ、編集中に他のノードを選択した際の動作を制御する必要があると思います また、この実装の場合何も編集しなかった場合も動作がおかしくなるようです … 編集モードから抜けれない状況になります

wweerr
質問者

お礼

回答ありがとうございます。 教えて頂いたコードを自分でも試してみました。 加えて、以下のURLにサンプルがありました。 http://69.10.233.10:80/KB/tree/CustomizedLabelEdit.aspx 両方をコードを元に、無事、期待通りの動作をさせる コードが作成できました。 ありがとうございました。

その他の回答 (2)

  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.2

ChangeイベントとかEditイベントとか起きないんでしたっけ?Text系の派生クラスなら起きそうな気がしますが。そこでイベントをハンドルして表示するのを後ろ2文字以外にするとか、ちょっと使い勝手は悪くなりますが編集用のダイアログを出すとかするとできるかもしれません。 あまりTreeViewは使ったことがないのですみません。 今ググったらBeforeLabelEditというイベントが起きますね(VB6以前なのかな。書き方がVB6っぽい)これをハンドルすればいいと思います。

wweerr
質問者

お礼

BeforeLabelEditイベントが発生したときに、TreeViewに2文字抜いた文字列が表示されるよう、試しています。ですが、まだ、うまくいきません。 ちなみに、以下の方法で駄目でした。もう少し試してみます。 //Loadイベントでノード"test"を作成 //BeforeLabelEditイベントプロシージャの中で、 //以下のコードを実行 Dim strTemp As String = "" Dim intCnt As Integer = 0 mstrTemp = TreeView1.Nodes(0).Text intCnt = mstrTemp.Length For i As Integer = 0 To intCnt - 3 strTemp += mstrTemp.Chars(i) //strTempには"te"が保存される Next TreeView1.Nodes(0).Text = strTemp //ここで入力すればTreeView上                  //では"te"と表示されると                  //思ったが駄目だった

  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.1

制限はできないので後ろ2文字を取り出しておいて(VB.Rightかなんかで)あとで付け足すくらいが現実的なやり方ではないでしょうか?

wweerr
質問者

お礼

回答ありがとうございます。 ちなみ、ノード名を編集する際、表示されるのは後ろ2文字を除いた文字列だけを表示することはできないでしょうか? そうすれば、ユーザからみたら、自分は後ろ2文字以外を編集しているということもはっきり伝わるので、誤解の生まれないよい操作になるかと思っているのですが。どうでしょうか?

関連するQ&A

  • C# TreeView 効率良いノード追加の仕方

    C# TreeViewについて質問させてください。 ノード(子ノード含む)を数万件以上登録する際に、効率の良い方法を教えて頂けないでしょうか? 実際のコードとは異なりますが、大まかに以下のような処理をメインスレッドで行っています。 class MyTreeNode : TreeNode{   void AddNode(){     BeginUpdate();     SuspendLayout();     foreach( var 親ノード情報 in 親ノード情報リスト ){       TreeNode parentNode = new TreeNode( 親ノード名 );       foreach( var 子ノード情報 in 子ノード情報リスト ){         TreeNode childNode = new TreeNode( 子ノード名);         parentNode.Nodes.Add( childNode );       }       this.Nodes.Add( parentNode );     }     ResumeLayout();     EndUpdate();   } } この方法ですと、かなり時間がかかってしまい、UIが固まったようになってしまいます。 (TreeViewに、子ノードの一斉展開機能が必要なので、親ノード展開時のイベントを拾って  子ノードを追加する方法は上記と同じく遅くなってしまうのではと思っていますがどうなんでしょうか?)

  • TreeViewの制御について

    ASP.NET2.0、VB.NETでWebアプリを開発しております。 現在、TreeViewコントロールを用いたマスタページに各コンテンツページを配置しています。 詰まっている箇所は二つです。 (1)マスターページ内のLoad処理で動的にノードを追加しているのですが、 各コンテンツページ呼び出し時に再生成されてしまい、メニューの展開が初期表示時に戻ってしまいます。 どうにか、展開情報を変更しない方法や、展開情報の保持、再現などできる方法はありませんでしょうか。 (2)コンテンツページのボタン押下で、メニューを選択できないようにし、 ボタン押下の処理終了時にメニューを復元することはできないでしょうか。 メニューの制御はできればEnabled(disabled)制御がいいのですが・・・ 恐れ入りますが、宜しくお願い致します。

  • フォームコントロールの文字編集

    Excel2007のUserです。フォームコントロールのことについて質問します。 開発、挿入でコントロールの挿入を行いますが、 たとえばコンボボックスをシートに挿入した場合、この ボックス内の文字を大きくしたり 色をつけたりする編集の方法がわかりません。 もともと編集できない物でしょうか? 文字が小さすぎです

  • Windows Media Playerでのタイトル、アルバム名の編集

    Windows Media Playerでタイトル、アルバム名の編集をしました。 しかし、MY Musicのフォルダにある音楽ファイルには編集した情報があまり反映されていません。 アルバム名の方は3分の1ほど編集が反映されており、中途半端です。 アルバム名もタイトルも確実に全部反映させたいのですが、どうすればよいのでしょう?

  • TreeViewの再表示のちらつきをなくす方法

    お世話になっております。 VB2005でWinアプリ開発中です。 テキストボックスに条件を入力し、ボタンを押下すると、 TreeViewに該当データのノードを設定し、 ノードを展開した状態で表示する処理があります。 ノードが展開表示されている状態で、ボタンを押下し 新しい情報を再表示すると、 ノードが折りたたまれて展開されたというような動きが見えてしまいます。 SuspendLayout/ResumeLayoutを入れてみたのですが、変化無しでした。 ノードが展開された状態で、パッと再表示するには、 どのようにすればよいのでしょうか? よろしくお願いします!

  • Windowsユーザーフォルダ名2バイト文字エラー

    HandBrakeという動画エンコードソフトを使っているのですが、2Pass(複数パスエンコード・マルチパスエンコード)を有効にするとエラーになり、その原因は恐らくユーザーフォルダ名にあると予想しています。エラーログからしてユーザー名が2バイト文字で構成されているからだと思われます。 H264書き出しの場合「x264 [error]: ratecontrol_init: can't open stats file」 H265書き出しの場合「x265 [error]: can't open stats file C:/Users/2バイト文字のユーザー名/AppData/Local/Temp/hb.7024/x265.log.temp encx265: x265_encoder_open failed.」 そこでふたつの打開策を模索しています。ひとつは「ユーザーフォルダ名(ディレクトリ名)の変更(または追加)」。ふたつ目は「TEMPの場所をオーバーライド」 まずひとつ目から。 問題のユーザーフォルダ名を変えてディレクトリから2バイト文字を無くす方法を考えています。 まずフォルダ名を直接変更(右クリックでは名称変更が出ないので、検索窓からの検索結果を右クリックして名称変更)してみましたが、ソフト(HandBrake)上では反映されていませんでした。 フォルダ名を一旦元に戻し、今度はコントロールパネルのユーザーアカウントからアカウント名の変更を実施。しかしこちらも効果が無く元に戻しました。 どの道ドライブCのユーザーフォルダ名が変わってしまうと他のソフトにも影響があるでしょうから、現在のユーザーフォルダを残しつつ新しく1バイトの名前で構成されたユーザーを用意しようと思っています。 その場合、Windowsの「ローカルアカウント」というものを作ればよいのでしょうか? また、ユーザーを新規作成した場合、今現在使っているフォルダ内のデータやソフトを共有することは簡単なのでしょうか? 今回問題になっているソフト「HandBrake」はインストーラー型ではなくポータブル型なので、仮にユーザー間でのデータ共有ができなくとも外部USBメモリ等に入れればできない事もないかな……とは思っています。 一応もう一つの打開策が「TEMPの場所をオーバーライドする」です。検索して出てきたページ(自動翻訳)なのでイマイチ内容が分かりませんが、恐らく「HandBrake」が参照する一時ファイルの場所を変更するという事でしょう。ただ、「HandBrake」の設定項目には出力先の変更はできるものの。エンコード時に参照していると思われるディレクトリの変更設定項目は見当たりませんでした。 参照したサイトのURLは貼れなかった気がするので、添付画像にスクリーンショットを用意しています。 使用しているOSはWindows10です。

  • ファイル名の一括編集について

    Windows XPを使用しています。 フォルダ内のファイル名の一括で編集したいのですがいいソフトありますか? ファイル名を一括で変えたいのではなく、ファイル名の共通する一部分を消したいんです。 例えば 「○○×apple」「▽▼apple」でappleという文字だけ消したいんです。 そんな都合いい方法とかソフトはありますか?

  • 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クリック時のイベントの拾い方をご存知の方がおられましたらご教授お願いします。

  • TreeViewについて

    いつも大変お世話になっております。福島です。 TreeViewのことで教えて頂きたいのですが・・・ 社員登録で3階層(部・課・社員)のツリー構造をなす TreeViewを作成しましたが、1社員の情報を変更したときに 状態を反映するためにTreeView全体を消去してから書き直しています。 (例えば)課や部を移動したとき しかし表示する数が多くなってきた為に再構築に非常に時間が かかってしまい実用的でなくなってしまいました。 あるノードの下だけ変更(削除)する方法はありますか? 今は、「treeView.Nodes.Clear」を使用して全体を削除して 再度ツリーを作成しています。 aNode(部) bNode(課) cNode(社員) のようになっています。 宜しくお願い申し上げます。 Windows2000SP2 + VB6.0SP4

  • ファイル名の末尾に一括で文字を追加したい

    コマンドプロンプトで ファイル名がバラバラであるファイルの末尾に一括で同じ文字「未編集」を付けたしたいのですが ネットで調べたところ、ren *.* ????????????????????????????????bbb.*というのを見つけたのですが ファイル名の文字数だけ「?」が必要なんでしょうか? 1文字にまとめることは出来ないでしょうか? OSはWin 8です。

専門家に質問してみよう