点击 GridView 查找选定行

6
我尝试使用GridView并获取被点击的行中的数据。我尝试了以下代码,当我点击行时,我收到所选索引,但是当我查看实际的GridView行时,它们为空。不确定我错过了什么。
.ASP让我的网格。
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="True" 
        CssClass="datatables" Width="100%" 
        DataSourceID="SqlDataSource1" 
        GridLines="None" ShowFooter="True" AllowSorting="True"  
        onrowcreated="GridView1_RowCreated" 
        onrowdatabound="GridView1_RowDataBound" ShowHeaderWhenEmpty="True" 
        onrowcommand="GridView1_RowCommand" 
        onselectedindexchanged="GridView1_SelectedIndexChanged">
        <HeaderStyle CssClass="hdrow" />
        <RowStyle CssClass="datarow" />
        <PagerStyle CssClass="cssPager" />
</asp:GridView>

在每一行数据绑定时,我会确保点击应该设置所选索引。
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);
     }
 }

当选定的索引通过点击更改时,将触发此事件。我可以在第一行上设置断点,并查看所点击的索引存储在变量a中。然而,当我到达foreach循环时,它会直接跳过它,因为GridView1显示具有0行的计数。理论上,它应该有几百行,当索引匹配时,它应该获取第6个单元格中的数据并将其存储在字符串b中。为什么我在点击时没有获取到任何行呢?

 protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
 {
            int a = GridView1.SelectedIndex

            foreach (GridViewRow row in GridView1.Rows)
            {
                if (row.RowIndex == a)
                {
                    b = row.Cells[6].Text;
                }
            }
 }

这里是我的页面加载。

protected void Page_Load(object sender, EventArgs e)
{
      c = HttpContext.Current.Session["c"].ToString();
      SqlDataSource1.ConnectionString = //My secret
      string strSelect = "SELECT columnnames from tablenames where c in (@c)
      SqlDataSource1.SelectParameters.Clear();
      SqlDataSource1.SelectCommand = strSelect;
      SqlDataSource1.SelectParameters.Add("c", c);
       try
        {
            GridView1.DataBind();
        }
        catch (Exception e)
        {

        }
        GridView1.AutoGenerateColumns = true;
}

我对AutoGenerateSelectButton的问题是它实际上会在每个东西旁边放置“选择”一词。我只想要一个简单的点击,它会做出必要的响应。不幸的是,在GridView中没有列出onClick事件。 - John Wesley Gordon
是的,抱歉。我删除了我的评论,因为从阅读您的代码中,我意识到您想在整行上拥有一个点击事件 =) - Josh Darnell
1个回答

7

尝试仅从SelectedRow属性中获取行:

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
    GridViewRow row = GridView1.SelectedRow;
    string b = row.Cells[6].Text;
}

据我所知,当您使用数据源控件(如SqlDataSource)时,在PostBacks中Rows集合不会重新填充。

如果在尝试遍历行之前在GridView上调用 .DataBind() ,则可以使用现有代码:

GridView1.DataSourceID="SqlDataSource1";
GridView1.DataBind();

但这种方法似乎有点不正规。


在看完您的Page_Load后,我发现您需要将数据绑定代码包装在if(!Page.IsPostBack)块中。每次回传数据绑定都会打断ASP.NET通过ViewState维护控件状态的过程。


当尝试获取SelectedRow时,我收到了“'GridView1.SelectedRow'引发了类型为'System.ArgumentOutOfRangeException'的异常”和“索引超出范围。必须是非负数且小于集合大小的参数名称:index”。同时,GridView1.SelectedIndex中有一个值为4,这正是我所期望的。 - John Wesley Gordon
1
@JohnWesleyGordon,你确定6是正确的列吗?数组是从零开始计数的,如果你选择了一个超出列范围的列,它会抛出那个错误。 - crthompson
@paqogomez 在此之前就出现了错误。无论我将其更改为 row.Cells[0].Text; 都没有关系。 - John Wesley Gordon
我刚刚尝试重新执行GridView1.DataBind(),这次成功了。但我不知道是否喜欢这种方法,因为如果在第一次数据绑定和这次新的数据绑定之间发生了更改,我将无法选择正确的行。例如,如果数据是Bob,Frank和John,而我选择了Frank,如果我再次进行数据绑定,数据返回为Bob,Carl,Frank和John,我会得到我选择了Carl的结果吗? - John Wesley Gordon
@John 能否将您的Page_Load代码添加到问题中?您是否将所有操作都放在if (!Page.IsPostBack)块中(仅在页面初始加载时执行)?由于您正在使用SqlDataSource,我只是假设您在代码后端没有手动进行数据绑定。 - Josh Darnell
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接