2009-06-10 68 views
0

我有一個數據綁定,模板控件,模板化區域內我創建一個事件處理程序的控制,像這樣:ASP.NET:訪問的DataItem從事件處理程序

<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層次結構發生變化或者什麼,我可以毫無困難地訪問這個關鍵字。在事件處理程序中使用此Key的最佳方式是什麼?

回答

2

最好的辦法是添加自定義屬性到您的複選框

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

,然後訪問使用它

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

這更像我正在尋找的東西。我會確保它的工作,並將其標記爲正確的迴應。喬恩的答案看起來像是同樣的事情,但看起來像你先發布。 :-) – StriplingWarrior 2009-06-11 15:21:29

0

一種可能的方法是將擴展方法添加到複選框中,該複選框爲您找到了TreeNode,它可以實現爲一些循環,遞歸搜索父節點直到找到TreeNode。

這樣你就可以調用selector.FindTreeNode(),當然這會在你的結構外調用的任何複選框失敗。

+0

我想過這個,但我在尋找更通用的東西......我可以用作最佳公關的東西actice。我也想過做一個像selector.FindParent(typeof(TreeNode))這樣的擴展方法,但它似乎仍然有一個更好的方法。 – StriplingWarrior 2009-06-11 15:15:32

0

最好的方法是創建自己的事件參數類,該類繼承自EventArgs並將其作爲屬性公開。由於您使用的是自定義或第三方控件,因此對於如何在事件參數上設置屬性我沒有任何建議。自定義事件ARGS應該是這樣的:

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

    int NodeKey { get; private set; } 

} 
+0

我正在使用自定義控件,因此如有必要,我可以添加到它。有什麼方法可以在我的ASP.NET標記中指出複選框的OnCheckedChanged事件應該通過這個專門的EventArgs類,還是我也必須創建自己的Checkbox版本? – StriplingWarrior 2009-06-11 15:19:23

0

您可以設置值屬性上的複選框

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

和檢索服務器端

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

I'm使用一種類似的解決方案爲他人着想,加入我的代碼,如果有幫助:

在標記:

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

而在事件處理程序:

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

這不是我正在尋找的東西,但它在其他情況下可能會有用。這是如何處理頁面上會有多個CheckedItems實例的事實? checkedItemRowIds是否以逗號分隔的列表結束?您明白ItemTemplate中的任何內容都會重複多次,對嗎? – StriplingWarrior 2009-06-11 15:11:33

相關問題