日期:2014-05-18  浏览次数:20463 次

关于GridView_RowDataBound事件
当鼠标放上一个Gridview的每一行时,会弹出一个悬浮框显示这一行的详细信息,将这个事件写在GridView1_RowDataBound事件中,但当用一个查询查询出新的表,GridView重新绑定数据时,悬浮框显示的信息不正确,比如说,重新绑定的GridView的第一行的ID是7,悬浮框显示的却是ID=1的数据,第二行的ID=9,显示的却是ID=2的数据,代码如下:
  protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
  {
  dt.Clear();
  dt = GetData("select * from Person");
  if(e.Row.RowType == DataControlRowType.DataRow)
  {
  string id = dt.Rows[e.Row.DataItemIndex]["craneInfoID"].ToString();
  string name = dt.Rows[e.Row.DataItemIndex]["serialNumber"].ToString();
  string gender= dt.Rows[e.Row.DataItemIndex]["deviceName"].ToString();
  string nationnality = dt.Rows[e.Row.DataItemIndex]["deviceType"].ToString();

  Label lab1 = e.Row.FindControl("Label1") as Label;
  lab1.Attributes.Add("onmouseover", "tip.show(this,'" + id + "','" + name + "','" + gender+ "','" + nationnality + "')");//当鼠标移到指定的label上时,调用自定义javascript函数显示悬浮层 }  
  }
这段代码在GridView正常加载时没有问题,但当我写了“查询”按钮的事件后,比如写了一句string commString = "select * from Person where nationnality = 'Chinese'"时,再将鼠标放上新加载的GridView的每一行时,显示不正确,就像上述提到的一样,这到底是怎么回事,头快破了,求大神指导回复,在在线等啊!  
 

------解决方案--------------------
每一行都执行dt.GetData,这个代价真是很奢侈的。最重要地,你的逻辑根本不能保证其行号跟e.Row.DataItemsIndex有什么对应关系。你最好用一个极限测试来保证你编程正确,就是用一个程序随时修改数据库,然后看看怎么这里的["craneInfoID"].ToString()出来的东西是多么脆弱。你的头就算撞地撞破了,也应该一次性地就达到设计的基线(公认的作为标准设计成果需要用文字确定下来的东西),不要心存不合理的侥幸。

在这里,通常可以这样
C# code
  protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
  {
  dt.Clear();
  dt = GetData("select * from Person");
  if(e.Row.RowType == DataControlRowType.DataRow)
  {
      var dt = GetDataByKey("select ....... where keyId='", 
             (string)GridView1.DataKeys[e.Row.DataItemIndex].Value.Replace("'","''") + "'");
      string id = (string)dt.Rows[0]["craneInfoID"];
      string name = dt.Rows[0]["serialNumber"].ToString();
      string gender= (string)dt.Rows[0]["deviceName"];
      string nationnality = (string)dt.Rows[0]["deviceType"];
      .......