点击按钮绑定GridView回传后显示空行问题求助
问题分析与解决方案
核心问题根源
回传时GridView显示空行的本质原因是:动态列调整仅在首次加载执行,回传时GridView控件树恢复到原始列结构,与当前绑定的DataTable列不匹配,导致Eval绑定失败。此外,类级变量returnTable的复用逻辑也可能引发列重复或结构不一致问题。
具体修复步骤
1. 每次页面加载都同步列结构
ASP.NET回传时会重建控件树,之前动态移除的列会自动恢复。因此必须在**每次页面加载(含回传)**时执行列调整,确保列结构与当前accessType匹配:
protected void Page_Load(object sender, EventArgs e) { // 无论是否回传,都执行列调整 AccessControlGridColumnAdjustment(); if (!IsPostBack) { AccessControlGrid.Visible = false; } }
2. 避免DataTable复用引发的列冲突
每次点击按钮时创建全新的DataTable,避免旧列结构干扰:
protected void ImgBtnGo_Click(object sender, EventArgs e) { // 每次请求都创建新的DataTable,彻底避免列重复问题 DataTable returnTable = new DataTable("AccessControl"); CreateAccessControlDataTable(ref returnTable, hdnAccessType.Value); LoadData(); PopulateDataTable(ref returnTable, accessControlResultSet, hdnAccessType.Value); AccessControlGrid.DataSource = returnTable; AccessControlGrid.DataBind(); AccessControlGrid.Visible = true; }
3. 确保列调整逻辑准确匹配accessType
完善AccessControlGridColumnAdjustment方法,根据当前accessType精准移除不必要的列,示例逻辑如下:
private void AccessControlGridColumnAdjustment() { string accessType = hdnAccessType.Value; // 倒序遍历列集合,避免索引偏移 for (int i = AccessControlGrid.Columns.Count - 1; i >= 0; i--) { TemplateField col = AccessControlGrid.Columns[i] as TemplateField; if (col == null) continue; string headerText = col.HeaderText; switch (accessType) { case "IPF": // 仅保留用户信息和IPF专属列 if (!headerText.Equals("User No") && !headerText.Equals("User Name") && !headerText.Equals("Submit In Prep Filing Deletion")) { AccessControlGrid.Columns.RemoveAt(i); } break; case "FLD": // 仅保留用户信息和Flood相关列 if (!headerText.Equals("User No") && !headerText.Equals("User Name") && !headerText.Contains("Flood")) { AccessControlGrid.Columns.RemoveAt(i); } break; // FS类型保留所有默认列,无需额外处理 } } }
4. 验证数据绑定有效性
在绑定前添加调试代码,确认DataTable的行数和字段值是否正确:
// 调试用:检查DataTable数据是否正常 foreach (DataRow row in returnTable.Rows) { Debug.WriteLine($"UserNo: {row["UserNo"]}, UserName: {row["UserName"]}"); }
内容的提问来源于stack exchange,提问作者LogicalDesk
相关产品推荐
相关产品推荐

