在浏览一些代码时,我发现有这样的代码:
ListViewDataItem dataItem = (ListViewDataItem)(((ImageButton)sender).Parent.Parent);
int noteId = Convert.ToInt32(((HiddenField)dataItem.FindControl("hidNoteId")).Value);
请解释这两行的含义。
答案 0 :(得分:4)
有一个控件(键入隐藏字段)用于跟踪ListView中项目的标识(http://msdn.microsoft.com/en-us/library/bb398790.aspx)
这是不应该写的代码,IMO。这是低效和脆弱的。此外,项目的标识以纯文本形式存储在页面源中。
此代码似乎在单击按钮时获取数据绑定项的标识。更好的方法是简单地设置按钮的命令参数,如下所示:
<asp:ImageButton runat="server" CommandArgument="[Binding Expression]" />
在按钮的事件处理程序中,可以检索CommandArgument并将其转换为Int32。使用这种方法,你甚至不需要那个隐藏的领域。
答案 1 :(得分:3)
首先,这两条线在使用括号和铸造时似乎有点疯狂。可能有更好的方法来做他们正在做的事情,但没有更多的代码,很难提供任何建议。
无论如何,第一行将在ImageButton
引发的事件的事件处理程序中。事件处理程序方法将具有sender
参数;这是投射到ImageButton
。然后在此ImageButton上调用Parent.Parent
;这将使对象在控制层次中达到两级。开发人员显然很确定这是一个ListViewDataItem
,所以它被投射到其中一个。因此,变量dataItem
现在包含ListViewDataItem
的实例。
在第二行中,FindControl
方法正在调用dataItem
方法。可能在此ListViewDataItem
下有一个ID为“hidNoteId”的控件。 FindControl
返回Control
;但开发人员知道这个控件实际上是HiddenField
,所以有一个演员。然后将此隐藏字段的Value
属性传递到Convert.ToInt32
方法以提供整数 - 然后将其存储在noteId
变量中。
所以在最后,有一个ListView,其中每个数据项都包含一个包含某个ID值的隐藏字段。此代码正在获取ID。
答案 2 :(得分:1)
当项目绑定到网格/转发器时,如果使用按钮作为后置控制,则需要一种方法来识别正在执行的行。上面所做的所有代码都是导航控件并从行中的一组值中提取值。