根据ID字符串数组查询数据库记录填充GridView及模板字段控件
解决方案
核心逻辑修正
原代码存在逻辑顺序错误:循环遍历GridView行的同时反复调用DataBind()重置控件,会导致之前的赋值全部丢失,且最终只会保留最后一个ID的查询结果。正确的实现逻辑是先收集全量数据一次性绑定GridView,模板字段控件的赋值全部放在RowDataBound事件中处理。
实现步骤
1. 全量数据查询与一次性绑定
在数据加载触发逻辑(如Page_Load、查询按钮点击事件)中写入以下代码:
// 拆分ID数组,过滤空值 string[] moodleIDs = this.moodleID.Split(',', StringSplitOptions.RemoveEmptyEntries); ScheduleToMoodleTemplate templateHandler = new ScheduleToMoodleTemplate(); List<ScheduleToMoodleTemplate> dataList = new List<ScheduleToMoodleTemplate>(); // 遍历ID查询所有匹配数据 foreach (string id in moodleIDs) { var item = templateHandler.ScheduleToMoodleTemplateSelectByID(id); if (item != null) { dataList.Add(item); } } // 一次性绑定GridView gvEdit.DataSource = dataList; gvEdit.DataBind();
2. 模板字段控件赋值(RowDataBound事件实现)
你前端已经声明了OnRowDataBound="gvEdit_RowDataBound",直接在后台实现该事件即可,每行数据绑定完成后会自动触发该事件处理模板字段:
protected void gvEdit_RowDataBound(object sender, GridViewRowEventArgs e) { // 仅处理数据行,跳过表头、页脚等行 if (e.Row.RowType != DataControlRowType.DataRow) { return; } // 获取当前行绑定的数据源对象 ScheduleToMoodleTemplate currentItem = (ScheduleToMoodleTemplate)e.Row.DataItem; // 查找当前行内的模板控件 DropDownList ddlScheduleType = e.Row.FindControl("DDLScheduleType") as DropDownList; DropDownList ddlDeliverType = e.Row.FindControl("DDLDeliverType") as DropDownList; TextBox tbCourseEdit = e.Row.FindControl("TbCourseEdit") as TextBox; // 先绑定下拉框选项,再赋值SelectedValue,避免出现"项不在列表中"错误 getScheduleTypeDDL(ddlScheduleType); getDeliverTypeDDL(ddlDeliverType); // 给控件赋值 if (currentItem.ScheduleTypeID.HasValue) { ddlScheduleType.SelectedValue = currentItem.ScheduleTypeID.Value.ToString(); } if (currentItem.DeliverTypeID.HasValue) { ddlDeliverType.SelectedValue = currentItem.DeliverTypeID.Value.ToString(); } int courseId = 0; int.TryParse(currentItem.CourseID?.ToString(), out courseId); tbCourseEdit.Text = currentItem.getCourseNameByID(courseId); }
注意事项
- 若
ScheduleToMoodleTemplateSelectByID返回的是DataRow/DataSet类型,调整RowDataBound中获取当前行数据的逻辑即可,无需修改整体流程 - 下拉框的选项绑定方法
getScheduleTypeDDL、getDeliverTypeDDL不需要额外修改,保持原有实现即可
内容的提问来源于stack exchange,提问作者KiterCodes
相关产品推荐
相关产品推荐

