GridView绑定DataTable后行索引不匹配问题及解决方法
自定义GridView项顺序:解决行索引不匹配问题
需求:有一个按整数列Order排序的GridView,其数据源DataTable存储在Session中,需要通过LinkButton的“up”和“down”按钮手动调整项的顺序。
最初实现方案(存在问题)
- 从RowClick事件中获取行索引:
LinkButton lb = (sender as LinkButton); string OrderNr = lb.CommandArgument; int OrderNummer = Convert.ToInt16(OrderNr); GridViewRow row = (GridViewRow)lb.NamingContainer; int idx = row.RowIndex;
- 调用Session中的DataTable并修改Order参数:
DataTable t = Session["SessionData"] as DataTable; t.Rows[idx][1] = Convert.ToString(OrderNummer - 1); t.Rows[idx-1][1] = Convert.ToString(OrderNummer);
- 重新排序DataTable并绑定回GridView:
t.DefaultView.Sort = "OderNr"; t = t.DefaultView.ToTable();
问题说明
该方案仅首次操作有效,后续t.Rows[idx]返回结果不可预测,原因是GridView行索引与DataTable行索引不匹配。
最终解决方案
核心思路:避免依赖行索引,通过循环利用CommandArgument中的OrderNumber定位DataTable中的目标行,再调整排序值。
完整代码(UP按钮事件)
protected void SelectOrderUp(object sender, EventArgs e) { if (Session["SessionData"] != null) { LinkButton lb = (sender as LinkButton); string OrderNr = lb.CommandArgument; int OrderNummer = Convert.ToInt16(OrderNr); DataTable t = Session["SessionData"] as DataTable; DataRow[] rows = t.Select(); for (int i = 0; i < rows.Length; i++) { if (Convert.ToInt16(rows[i][7].ToString()) == OrderNummer) { rows[i][7] = Convert.ToString(OrderNummer-1); rows[i - 1][7] = OrderNummer; break; } } t.DefaultView.Sort = "OrderNummer"; t = t.DefaultView.ToTable(); Session["SessionData"] = t; GridView_Criteria.DataSource = t; GridView_Criteria.DataBind(); } }
内容的提问来源于stack exchange,提问作者Barnabeck
相关产品推荐
相关产品推荐

