ASP.NET中GridView1_SelectedIndexChanged事件无响应问题求助
ASP.NET GridView选择项无法显示到TextBox的问题解决
自学ASP.NET(通过YouTube学习),使用Visual Studio 2015开发。创建空项目,添加母版页和默认页,页面包含TextBox、GridView、ScriptManager及UpdatePanel。期望点击GridView选择按钮后,将选中项显示在TextBox中,但点击后TextBox始终为空,代码未执行预期操作。
相关代码如下:
MasterPage.master
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <asp:ContentPlaceHolder id="head" runat="server"> </asp:ContentPlaceHolder> </head> <body> <form id="form1" runat="server"> <div> <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server"> </asp:ContentPlaceHolder> </div> </form> </body> </html>
Default.aspx
<%@ Page Title="" enableeventvalidation="true" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> <style type="text/css"> .auto-style1 { width: 100%; } </style> </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <table class="auto-style1"> <tr> <td> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> <asp:GridView ID="GridView1" runat="server" OnSelectedIndexChanged="GridView1_SelectedIndexChanged"> <Columns> <asp:CommandField ButtonType="Button" ShowSelectButton="True" /> </Columns> </asp:GridView> </td> </tr> </table> </ContentTemplate> </asp:UpdatePanel> </asp:Content>
Default.aspx.cs
using System; using System.Data; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { DataTable tbl = new DataTable(); tbl.Columns.Add("serial"); for (int i = 0; i < 4; i++) { DataRow row = tbl.NewRow(); row[0] = i + 1; tbl.Rows.Add(row); } GridView1.DataSource = tbl; GridView1.DataBind(); } } protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) { TextBox1.Text = GridView1.SelectedRow.Cells[0].Text; } }
问题原因
你在GridView1_SelectedIndexChanged事件中使用Cells[0]获取内容,但GridView里首先添加了CommandField(选择按钮列),这一列是GridView的第0个单元格,而你要获取的serial列是第1个单元格,所以取到的是空值。
解决方法
将事件中的单元格索引从0改为1,修改后的代码如下:
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) { TextBox1.Text = GridView1.SelectedRow.Cells[1].Text; }
如果想避免索引出错,也可以给GridView显式绑定列,这样能更清晰地控制列的位置,修改Default.aspx中的GridView部分:
<asp:GridView ID="GridView1" runat="server" OnSelectedIndexChanged="GridView1_SelectedIndexChanged"> <Columns> <asp:CommandField ButtonType="Button" ShowSelectButton="True" /> <asp:BoundField DataField="serial" HeaderText="序号" /> </Columns> </asp:GridView>
这样无论列顺序如何调整,都可以用更可靠的DataBinder.Eval来获取值:
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) { TextBox1.Text = DataBinder.Eval(GridView1.SelectedRow.DataItem, "serial").ToString(); }
内容的提问来源于stack exchange,提问作者mo fa
相关产品推荐
相关产品推荐

