我有一个数据绑定的模板化控件,在模板化区域内我使用事件处理程序创建一个控件,如下所示:
<tnl:DisplayTree ID="DisplayTree1" runat="server" KeyPropertyName="Id"
ParentPropertyName="ParentDemographic" DataSourceID="DemographicObjectSource">
<ItemTemplate>
<asp:CheckBox ID="DemogSelector" runat="server" OnCheckedChanged="DemogSelector_OnCheckedChanged" />
<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层次结构发生变化,我可以毫无困难地访问密钥。在事件处理程序中提供此密钥的最佳方法是什么?
答案 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"];