You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GridView绑定DataTable后行索引不匹配问题及解决方法

自定义GridView项顺序:解决行索引不匹配问题

需求:有一个按整数列Order排序的GridView,其数据源DataTable存储在Session中,需要通过LinkButton的“up”和“down”按钮手动调整项的顺序。

最初实现方案(存在问题)

  1. 从RowClick事件中获取行索引:
LinkButton lb = (sender as LinkButton);
string OrderNr = lb.CommandArgument;
int OrderNummer = Convert.ToInt16(OrderNr);
GridViewRow row = (GridViewRow)lb.NamingContainer;
int idx = row.RowIndex;
  1. 调用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);
  1. 重新排序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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 18:13:31