0

私は特別なファイルを選択するための UserControl に取り組んでいます。このコントロールには、TreeViewユーザーがファイルを選択したときにノードが取り込まれる があります。また、ユーザーはこのツリービューからファイルを削除できます!

このコントロールをウィザード形式で使用しています。このウィザード フォームには という名前のボタンがbuttonNextあり、このボタンはデフォルトで無効になっています。

ユーザーコントロールでツリービューのイベントを作成するにはどうすればよいですか?それが設定されると、ウィザード形式の次のボタンが有効になるように通知し、ユーザーがそのツリービューからすべてのファイルを削除すると、ボタンが再び無効になるように通知します。

PS: ファイルの選択 (ブラウザー ダイアログなど) はすべてこのユーザー コントロール内で行われるため、私のウィザード形式では、このコンポーネントで行われていることにはアクセスできませんが、TreeView 自体をパブリックとして設定するだけなので、ウィザード形式でそのノードを読み取ることができます。

イベントをサブスクライブする方法は知っていますが、自分でイベントを作成したことはありません:(

4

6 に答える 6

1

イベントを作成して起動する方法に関する完全なチュートリアルについては、この MSDN の記事を参照してください。
http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx

于 2012-07-11T09:27:41.047 に答える
1

Treeview のイベントを伝播するだけです。

これをカスタム コントロールに追加すると、SelectedNodeChangedイベントが発生します。

public event EventHandler SelectedNodeChanged
{
   add { tree.SelectedNodeChanged += value; }
   remove { tree.SelectedNodeChanged-= value; }
}
于 2012-07-11T09:29:48.940 に答える
1

TreeView を作成しているのは誰ですか? その上にデータをロードするものは、ロードが完了したときに [次へ] ボタンを有効にすることができます。何か不足していますか?

ちなみに、次のようなイベントを作成します。

public event EventHandler<EventArgs> YouEventName;

そして、あなたはそれをメソッドのように呼び出します:

this.YourEventName(this,EventArgs.Emtpy);

ベスト プラクティスとして、次のように呼び出すメソッドを作成する必要があります。

protected virtual void OnYourEventName()
{
    if (this.YourEventName != null)
    {
        this.YourEventName(this, EventArgs.Empty);
    }
}
于 2012-07-11T09:25:19.097 に答える
1

CustomControl でイベントを宣言します。

public event EventHandler DataPopulated;
public event EventHandler DataRemoved;

On<EventName>一般的な方法は、イベントにハンドラーがアタッチされていることを確認し、必要な引数を渡してイベントを発生させるという名前の、保護された仮想メソッドを作成することです (子孫クラスでそれらをオーバーライドできるようにするため) 。

protected virtual void OnDataPopulated()
{
    if (DataPopulated != null)
        DataPopulated(this, EventArgs.Empty);
}

注: イベント ハンドラーにデータを渡す必要がある場合は、ジェネリックEventHandler<DataPopulatedEventArgs>デリゲートをイベント タイプとして使用します。ここでDataPopulatedEventArgs、 は から継承されたクラスEventArgsです。

次に、データが入力された直後にこのメソッドを呼び出します。

treeView.Nodes = GetNodes();
OnDataPopulated();

次に、このイベントをサブスクライブして、次のボタンを有効にします。

private void CustomControl_DataPopulated(object sender, EventArgs e)
{
   buttonNext.Enabled = true;
}
于 2012-07-11T09:39:57.463 に答える
0

新しいイベントの作成

public event EventHandler<EventArgs> myEvent;

次に、何らかのメソッドから呼び出します

this.myEvent(sender, e);

実際のイベントは次のようになります。

protected void MyEvent(object sender, EventArgs e)
{
    //Your code here
}
于 2012-07-11T09:37:58.383 に答える
0

コードは次のようになります。

public delegate void ChangedEventHandler(object sender, EventArgs e);

class TreeViewEx : TreeView
{
    ...

    public event ChangedEventHandler Changed;

    protected virtual void OnChanged(EventArgs e)
    {
        if (Changed != null)
            Changed(this, e);
    }
}

そしてその使い方

  TreeViewEx tree = ...
  tree.Changed += new EventHandler(TreeChanged);


  // This will be called whenever the tree changes:
  private void TreeChanged(object sender, EventArgs e) 
  {
     Console.WriteLine("This is called when the event fires.");
  }
于 2012-07-11T09:39:26.580 に答える