2009-06-10 2 views
0

からのアクセスのDataItemは、私がデータバインド、テンプレートコントロールを持っており、テンプレート領域内私はそうのように、イベントハンドラでコントロールを作成します。ASP.NET:イベントハンドラ

<tnl:DisplayTree ID="DisplayTree1" runat="server" KeyPropertyName="Id" 
ParentPropertyName="ParentDemographic" DataSourceID="DemographicObjectSource"> 
<ItemTemplate> 
    <asp:CheckBox ID="DemogSelector" runat="server" OnCheckedChanged="DemogSelector_OnCheckedChanged" /> &nbsp; 
    <asp:Label ID="InlineEditLabel" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "Name") %>'></asp:Label> 
    </ItemTemplate> 
</tnl:DisplayTree> 

イベント内でハンドラ、私は、コントロールが作成された項目のキーを検出できるようにしたいと思います。たとえば、次のように

protected void DemogSelector_OnCheckedChanged(object sender, EventArgs e) 
{ 
    CheckBox selector = (CheckBox)sender; 
    DisplayTree.TreeNode treeNode = (DisplayTree.TreeNode)selector.Parent.Parent.Parent.Parent; 
    Label1.Text += (int)treeNode.Key + ", "; 
} 

あなたが見ることができるように、このアプローチは私のDisplayTree.TreeNodeクラス内の階層の密接な知識を必要とする(つまり、私はどこ私はよsender.Parent.Parent.Parent.Parentであることを知っている必要がありますDisplayTree.TreeNodeオブジェクトを見つけてください)。 TreeNode階層が変更されたり、何かが変わったりすると、問題なくキーにアクセスできるように、少し頑強にしたいと思います。このキーをイベントハンドラ内から利用できるようにするには、どうすればよいでしょうか?

答えて

2

最良の方法は、カスタムを追加することですサーバー側を取得することができますあなたのチェックボックスの属性

<asp:CheckBox ID="DemogSelector" runat="server" oncheckedchanged="DemogSelector_CheckedChanged" AutoPostBack="true" key='<%# Eval("Id") %>'/> 
<ItemTemplate> 
     <input type="checkbox" 
      value="<%# Container.DataItemIndex %>" name="CheckedItems" /> 
    </ItemTemplate> 

そしてイベントハンドラで:マークアップで

:そして、それはそれは場合に役立ちます私のコードを追加して、他の人と同様の液の種類を使用して

string key = (sender as CheckBox).Attributes["key"]; 
+0

これは私が探していたものによく似ています。私はそれが動作することを確認し、正しい応答としてマークします。ジョンの答えは同じように見えますが、最初に投稿したようです。 :-) – StriplingWarrior

0

考えられる方法の1つは、TreeNodeが見つかるチェックボックスに拡張メソッドを追加することです。TreeNodeが見つかるまで、親を再帰的に検索するループとして実装できます。

このようにしてselector.FindTreeNode()を呼び出すだけで、構造体の外側にある任意のチェックボックスで失敗します。

+0

私はそれについて考えましたが、より一般的なものを探しています...私は最高のPRとして使うことができるものactice。私はまた、selector.FindParent(typeof(TreeNode))のような拡張メソッドを行うことを考えましたが、より良い方法がなければならないようです。 – StriplingWarrior

0

EventArgsから継承した独自のイベント引数クラスを作成し、そこにプロパティとして公開することをお勧めします。カスタムコントロールやサードパーティのコントロールを使用しているので、イベント引数にプロパティを設定する方法についてアドバイスはありません。カスタムイベントの引数は、次のようになります。

public class TreeNodeCheckedChangedEventArgs : EventArgs 
{ 
    TreeNodeCheckedChangedEventArgs(int nodeKey) 
    { 
     NodeKey = nodeKey; 
    } 

    int NodeKey { get; private set; } 

} 
+0

私はカスタムコントロールを使用していますので、必要に応じて追加することができます。チェックボックスのOnCheckedChangedイベントがこの特殊なEventArgsクラスを渡す必要があることをASP.NETマークアップに示す方法はありますか、独自のバージョンのチェックボックスを作成する必要がありますか? – StriplingWarrior

0

あなたがチェックボックス

<asp:CheckBox ID="DemogSelector" runat="server" oncheckedchanged="DemogSelector_CheckedChanged" AutoPostBack="true" value='<%#DataBinder.Eval(Container.DataItem, "Id") %>' /> 

にvalue属性を設定し、

string value = ((CheckBox)sender).Attributes["value"]; 
0

- 私を使用してアクセスします。

string checkedItemRowIds = Request.Form["CheckedItems"]; 
+0

これは私が探しているものではありませんが、他の状況では役に立ちます。これは、ページに複数のCheckedItemのインスタンスが存在するという事実をどのように処理しますか? checkedItemRowIdsはカンマで区切られたリストなどで終わりますか?あなたは、ItemTemplateにあるものは何度も何度も繰り返されることを理解しています。 – StriplingWarrior

関連する問題