单击GridView查找所选行

我正在尝试使用GridView并从单击的行中获取数据。 我已经尝试了下面的代码,当我单击该行时,我返回所选索引,但当我查看GridView中的实际行时,它们显示为空。 不知道我错过了什么。

.ASP让我的网格。

     

在每行数据绑定上,我确保单击应设置所选索引。

 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; } 

尝试从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(); 

但这似乎有点hacky。


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