【问题标题】:Use Same Event Arugments For GridView为 GridView 使用相同的事件参数
【发布时间】:2021-07-07 15:18:21
【问题描述】:

当使用 gridviews 时,有 4 个常用的事件处理程序:

  • _SelectedIndexChanged 使用 .SelectedRow.Cells[0].Text 来获取选定的行

  • _RowEditing 使用 gridiview.EditIndex = e.NewEditIndex 将行设置为编辑模式

  • _RowUpdating 使用 e.RowIndex 来检索单击更新按钮的行索引

  • _RowCancelingEdit gridviewname.EditIndex = -1 将 griview 返回到原始状态

有没有一种方法可以让您无需记住所有这些事件处理程序的 SelectedRow、EditIndex、RowIndex?我认为这与 sender 对象有关,但我找不到任何示例

【问题讨论】:

    标签: c# asp.net indexing gridview


    【解决方案1】:

    而您遗漏了非常常见的第​​ 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 中的整个对象 + 事件模型。这样做通常会更少的代码和更少的麻烦。

    【讨论】:

      猜你喜欢
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 2013-07-09
      • 1970-01-01
      相关资源
      最近更新 更多