而您遗漏了非常常见的第 5 个单行命令。
没有办法绕过这个事件模型。例如,如果您在 gridview 上放置一个按钮(或者现在更好的是 listview - 我更喜欢 listview,因为您不必将每个 asp.net 控件包装在模板中 - 您只需将控件拖放到列表中视图 - 使用 gridview 你需要凌乱的模板 div。
那么,在丢失的情况下?我将跳过所有 4-5 个事件,并直接在整个混乱中编写代码。
假设我将一个 asp.net 按钮放到那个 gridview/list 视图中?好吧,代替说那 5 个可能的事件和要处理的模型?您“可以”输入属性 CommandName="select"。这样做将触发命令行和索引都更改(行索引在命令行事件中尚未更改,但两个事件都会触发)。但是命令行确实允许您获取传递的行。
但是,我经常把上面的一切抛在一边。我经常不想弄乱所有那些额外的模板和所有那些复杂的事件——它们可能很难处理。
所以,我将插入一个按钮。您可以像这样在标记中连接一个事件:
<asp:Button ID="pUploadFiles" runat="server" cssclass="pUploadFiles"
Text='Upload Files'
PortalComp = '<%# Eval("PortalComp")%>'
ContactNameID = '<%# Eval("ContactNameID")%>'
QuoteNum = '<%# Eval("QuoteNum")%>'
ProjectHeaderID = '<%# Eval("ID")%>'
ContactGeneralID = '<%# Eval("ContactGeneralID")%>'
>
</asp:Button>
所以在上面,我只是折腾了一些额外的属性。并且这些列甚至不必是网格的一部分 - 只有在 databind() 时的 sql。
那么,传递 PK 值还是什么?我只是包含在按钮中。
那么在点击事件中,你可以这样做:
dim btn as Button
btn = Sender
With btn.Attributes
Session("PortalComp") = .Item("PortalComp")
Session("ContactID") = .Item("ContactNameID")
所以,我只是跳过所有内容。您可以将事件存根添加到任何按钮。虽然这些按钮被放入该网格 - 您不能双击按钮来生成事件存根,但您可以在编辑标记时这样做:
在上面,intel-sense 为您提供了一个选项,即使是一个按钮也可以创建按钮事件代码存根。我发现很多人都错过了这个提示。 (当您选择创建新事件时 - 似乎没有发生任何事情,但如果您现在跳转到后面的代码,您会看到标准事件按钮代码存根已为您创建并连接起来。
结果呢?
您只需将一个按钮拖放到该网格视图/列表视图中。然后,您可以将其编码为任何旧的平面简按钮单击。您可以传递行索引或 PK 行值。正如该按钮的一些自定义属性所指出的那样,您甚至可以保持/拥有不属于gridview/listview的列。传递行索引的表达式为:
CommandArgument='<%# Container.DataItemIndex %>' />
结果呢?我不是在处理该 gv/lv 的潜在 5 个常见事件,而只是像我在表单上放置任何其他简单按钮一样编写代码。而且我可以用自定义属性传递一个PK行,或者上面的Container.DataItemIndex给我行索引。所以现在 GridView1.items(rowix) 无论如何都可以用来提取行。
现在,一段时间后,人们将开始看到/知道这 5 个事件之间的区别。有些通过行索引(然后允许抓取任何行)。某些事件不会或不会更改行索引事件(行命令)。因此,一段时间后,人们会来看看/了解/找出最适合使用的事件。通常我会设置 CommandArugment="Select"。这会触发行命令和索引更改。但是我把我的代码放在 index changed 中,因为行指针会移动 - 尽管我有/有/可以使用两个在此处触发的事件(行命令 + 索引更改),但我发现它更易于使用。
但是,如上所示?通常我只是放入一个 asp.net 按钮,在后面连接一个事件代码,然后忽略该 gv/lv 中的整个对象 + 事件模型。这样做通常会更少的代码和更少的麻烦。