单击GridView查找所选行

时间:2014-01-07 21:35:20

标签: c# asp.net gridview onclick gridviewrow

我正在尝试使用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的Count为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;
}

1 个答案:

答案 0 :(得分:7)

尝试从SelectedRow属性中抓取行:

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

我的理解是,当您使用这些数据源控件(如SqlDataSource)时,Rows集合不会在PostBacks上重新填充。

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

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

但这看起来有点哈哈。


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