ASP.NET:从事件处理程序访问DataItem

时间:2009-06-10 23:13:04

标签: c# 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>

在事件处理程序中,我希望能够检测为其创建控件的项的Key。例如:

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层次结构发生变化,我可以毫无困难地访问密钥。在事件处理程序中提供此密钥的最佳方法是什么?

5 个答案:

答案 0 :(得分:2)

最好的方法是在复选框中添加自定义属性

<asp:CheckBox ID="DemogSelector" runat="server" oncheckedchanged="DemogSelector_CheckedChanged" AutoPostBack="true" key='<%# Eval("Id") %>'/>

然后使用

访问它
string key = (sender as CheckBox).Attributes["key"];

答案 1 :(得分:0)

一种可能的方法是向复选框添加一个扩展方法,它为您找到TreeNode,它可以实现为一些循环,递归搜索父项,直到找到TreeNode。

这样你只需调用selector.FindTreeNode(),当然这会在你结构外部的任何复选框上失败。

答案 2 :(得分:0)

最好的方法是创建自己的事件参数类,该类继承自EventArgs并将其作为属性公开。由于您使用的是自定义或第三方控件,因此我对如何在事件args上设置属性没有任何建议。自定义事件args看起来像这样:

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

    int NodeKey { get; private set; }

}

答案 3 :(得分:0)

您可以在复选框

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

检索服务器端

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

答案 4 :(得分:0)

我正在使用与其他人类似的解决方案,如果有帮助则添加我的代码:

在标记中:

    <ItemTemplate>
        <input type="checkbox" 
          value="<%# Container.DataItemIndex %>" name="CheckedItems" />
    </ItemTemplate>

在事件处理程序中:

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