c# - 如何使用 button_click 事件获取行索引
问题描述
<asp:GridView class="table table-striped table-bordered " ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="dish_id" DataSourceID="SqlDataSource1" OnRowCommand="GridView1_RowCommand">
<Columns>
<asp:BoundField DataField="dish_id" HeaderText="ID" ReadOnly="True" SortExpression="dish_id" />
<asp:TemplateField>
<ItemTemplate>
<div class="container-fluid">
<div class="row">
<div class="col-lg-8">
<div class="row">
<div class="col-12">
<asp:Label ID="Label1" runat="server" Font-Bold="True" Font-Size="X-Large" Text='<%# Eval("dish_name") %>'></asp:Label>
</div>
</div>
<div class="row">
<div class="col-12">
Category-<asp:Label ID="Label2" Font-Bold="True" runat="server" Text='<%# Eval("cat_name") %>'></asp:Label>
| Cuisine-
<asp:Label ID="Label3" Font-Bold="True" runat="server" Text='<%# Eval("cuisine") %>'></asp:Label>
| Price-
<asp:Label ID="Label4" Font-Bold="True" runat="server" Text='<%# Eval("price") %>'></asp:Label>
</div>
</div>
<div class="row">
<div class="col-12">
Description-
<asp:Label Font-Bold="True" ID="Label5" runat="server" Text='<%# Eval("dish_description") %>'></asp:Label>
</div>
</div>
</div>
<div class="col-lg-2">
<asp:Image class="img-fluid" ID="Image1" runat="server" ImageUrl='<%# Eval("dish_img_link") %>' />
</div>
<div class="col-lg-2">
<asp:Button ID="Button1" class="btn btn-outline-info btn-block btn-sm" runat="server" Text="Add to Cart" OnClick="Button1_Click" />
</div>
</div>
</div>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
我在每一行前面都有这个 GridView & 按钮(添加到购物车),我想获取单击其按钮的特定行的 ID。我观看了一些使用复选框更改事件的教程,但我想使用 button_click 事件获取 id。可能吗?
解决方案
您没有提到这是客户端 Java 点击还是服务器端点击?当您想开始在网格中使用自定义控件和标准 asp.net 控件时?那么我强烈建议您翻转以使用列表视图。它们非常相似,但列表视图支持标准控件,而不必将控件包装在模板中 - 因此标记更加清晰,您可以更轻松地将按钮等放入给定的行中。
作弊的方式(绕过所有gridview事件),权力过去的问题,不要太在意?
然后为您的按钮执行此操作:
<asp:Button ID="Button1" class="btn btn-outline-info btn-block btn-sm" runat="server"
Text="Add to Cart" OnClick="Button1_Click"
MyPKID = '<%# Eval("ID") %>'
MyRow = '<%# Container.DataItemIndex %>'
/>
请注意,我如何同时获取数据行的 pK 非常有趣(在上面的示例中,主键行列名称是“ID”)。这是一个很棒的技巧,因为您通常不希望 PK 行 ID 显示在网格中,隐藏它可能会很痛苦。因此,在上面,我获取了数据库行的 BOTH PK 以及行索引 - 不确定你想要哪一个 - 所以让我们获取 BOTH 值。
好的,现在在您的点击事件中,您可以这样做:
protected void btnRowJump_Click(object sender, EventArgs e)
{
Button btn = sender;
int MyRow = btn.Attributes.Item("MyRow");
int MyPKID = btn.Attributes.Item("MyPKID");
Debug.Print("Database PK id = " + MyPKID.ToString());
Debug.Print("grid row click = = " + MyRow.ToString());
// Get grid row data item
GridViewRow MyGvRow = GridView1.Rows(MyRow);
}
因此,使用您自己的“自定义”属性通常会很方便。我可能在该数据库行中有几个数据项 - 但未显示在网格中。所以你看我这样做:
<asp:LinkButton ID="pUploadFiles" runat="server"
Text='Upload Files'
PortalComp = '<%# Eval("PortalComp")%>'
ContactNameID = '<%# Eval("ContactNameID")%>'
QuoteNum = '<%# Eval("QuoteNum")%>'
ProjectHeaderID = '<%# Eval("ID")%>'
ContactGeneralID = '<%# Eval("ContactGeneralID")%>'
</asp:LinkButton>
因此,只要数据行在数据绑定时存在,那么我不必在显示部分中包含这些行 - 但是在绑定时来自数据源的任何行都可以在上面使用。所以在上面,这些行没有显示在网格中,但我仍然将它们获取/抓取到自定义属性中,并按照代码示例将它们取出。
说了上面的话?请记住,上述技巧不会触发 GridView 更改索引事件 - 所以你不能在代码中说 go
MyRvRow2 = GridView1.SelectedRow
但是,我经常发现我并不关心或不需要或希望更改选择的实际网格行,这没什么大不了的。您可以通过以下方式强制更改行:
GridView1.SelectedIndex = MyRow
大多数示例建议设置 CommandName = "My Select",然后使用 CommandArugment。这意味着您没有单独的按钮单击事件存根,而是使用 gridview 的 RowCommand 事件。使用上面的“自定义属性”技巧,您最终会编写更少的代码,但是您会为每个按钮获得很好的单独代码事件存根 - 在很多情况下,我更喜欢利用和使用 GridView事件模型。
推荐阅读
- python - 如何解决“在未引用的字段中看到换行符 - 您需要以通用换行模式打开文件吗?”
- python - matplotlib - 在 y 轴上具有自定义非线性频率刻度的 imshow 频谱图
- machine-learning - 使用 keras 函数 api 从头开始训练 VGG16。所有测试图像都被预测为一类
- django - 翻译 django tables2 模板列标题
- typescript - (firebase-admin)错误:错误:客户端离线但不是?
- html - 居中 div 的大小很小
- python-3.x - psycopg2:无法适应“懒惰”类型
- sprite-kit - AudioKit 通过触摸触发振荡器导体
- python - 发生异常:JSONDecodeError Expecting value: line 1 column 1 (char 0) 在处理上述异常期间,发生了另一个异常:
- python - 在 Python 中生成具有两个 f 字符串替换的 url 列表