如何让ASP.NET中C#实现的DataView/ListView可点击并通过Response.Write显示数据
ASP.NET中DataView/ListView行点击获取数据并输出的实现方法
一、ListView 实现方案
方式1:通过LinkButton触发点击
- 前端ASPX代码:
在ListView的ItemTemplate中添加LinkButton,指定命令参数和后台事件:<asp:ListView ID="ListView1" runat="server" OnItemCommand="ListView1_ItemCommand"> <LayoutTemplate> <table class="table"> <tr> <th>ID</th> <th>姓名</th> <th>操作</th> </tr> <tr id="itemPlaceholder" runat="server"></tr> </table> </LayoutTemplate> <ItemTemplate> <tr> <td><%# Eval("ID") %></td> <td><%# Eval("Name") %></td> <td> <asp:LinkButton ID="lnkSelect" runat="server" CommandName="SelectRow" CommandArgument='<%# Container.DataItemIndex %>' Text="查看数据"></asp:LinkButton> </td> </tr> </ItemTemplate> </asp:ListView> - 后台C#代码:
在ItemCommand事件中提取行数据并输出:protected void ListView1_ItemCommand(object sender, ListViewCommandEventArgs e) { if (e.CommandName == "SelectRow") { int rowIndex = Convert.ToInt32(e.CommandArgument); ListViewItem targetItem = ListView1.Items[rowIndex]; // 从行控件或数据源对象提取数据 string id = targetItem.DataItem.GetType().GetProperty("ID")?.GetValue(targetItem.DataItem).ToString(); string name = targetItem.DataItem.GetType().GetProperty("Name")?.GetValue(targetItem.DataItem).ToString(); Response.Clear(); Response.Write($"点击行数据:ID={id},姓名={name}"); Response.End(); } }
方式2:整行可点击(无需按钮)
通过JS回发事件实现整行点击:
- 前端ASPX代码:
<asp:ListView ID="ListView1" runat="server" OnItemCommand="ListView1_ItemCommand"> <LayoutTemplate> <table class="table"> <tr> <th>ID</th> <th>姓名</th> </tr> <tr id="itemPlaceholder" runat="server"></tr> </table> </LayoutTemplate> <ItemTemplate> <tr style="cursor:pointer;" onclick='<%# $"__doPostBack(\"{ListView1.UniqueID}\", \"SelectRow${Container.DataItemIndex}\")" %>'> <td><%# Eval("ID") %></td> <td><%# Eval("Name") %></td> </tr> </ItemTemplate> </asp:ListView> - 后台代码和方式1一致,无需修改
ItemCommand逻辑。
二、DataView 相关实现(搭配GridView)
DataView是数据容器而非UI控件,通常绑定到GridView展示。以下是绑定DataView的GridView行点击实现:
方式1:按钮触发点击
- 前端ASPX代码:
<asp:GridView ID="GridView1" runat="server" OnRowCommand="GridView1_RowCommand" AutoGenerateColumns="False"> <Columns> <asp:BoundField DataField="ID" HeaderText="ID" /> <asp:BoundField DataField="Name" HeaderText="姓名" /> <asp:ButtonField Text="查看数据" CommandName="SelectRow" /> </Columns> </asp:GridView> - 后台C#代码:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 模拟生成DataView DataTable dt = new DataTable(); dt.Columns.Add("ID", typeof(int)); dt.Columns.Add("Name", typeof(string)); dt.Rows.Add(1, "张三"); dt.Rows.Add(2, "李四"); DataView dv = dt.DefaultView; GridView1.DataSource = dv; GridView1.DataBind(); } } protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) { if (e.CommandName == "SelectRow") { int rowIndex = Convert.ToInt32(e.CommandArgument); GridViewRow targetRow = GridView1.Rows[rowIndex]; string id = targetRow.Cells[0].Text; string name = targetRow.Cells[1].Text; Response.Clear(); Response.Write($"点击行数据:ID={id},姓名={name}"); Response.End(); } }
方式2:整行可点击
通过RowDataBound事件给行添加点击回发:
- 后台C#代码:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.Attributes["onclick"] = Page.ClientScript.GetPostBackClientHyperlink(GridView1, "Select$" + e.Row.RowIndex); e.Row.Style["cursor"] = "pointer"; } } protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) { GridViewRow selectedRow = GridView1.SelectedRow; string id = selectedRow.Cells[0].Text; string name = selectedRow.Cells[1].Text; Response.Clear(); Response.Write($"点击行数据:ID={id},姓名={name}"); Response.End(); } - 补充:为避免回发验证报错,重写
Render方法注册验证:protected override void Render(HtmlTextWriter writer) { foreach (GridViewRow row in GridView1.Rows) { if (row.RowType == DataControlRowType.DataRow) { Page.ClientScript.RegisterForEventValidation(GridView1.UniqueID, "Select$" + row.RowIndex); } } base.Render(writer); }
内容的提问来源于stack exchange,提问作者Q-UA-SIMODO
相关产品推荐
相关产品推荐

