C#中DataReader嵌套While循环填充层级分类下拉框异常问题
搞定分类下拉框的循环异常与DataReader嵌套问题
嘿,我来帮你解决这个头疼的问题!咱们先揪出根源:嵌套使用DataReader就是导致循环第一轮就崩的罪魁祸首。默认情况下,一个数据库连接同一时间只能跑一个DataReader,你在外层while (reader.Read())里又开了个内层Reader读子分类,直接就把外层的读取流程打断了,可不就第一轮循环后就异常退出嘛!
下面给你一套落地的解决方案,分三步走,彻底解决问题:
1. 先把所有分类数据捞到内存里,避开DataReader嵌套的坑
别再边读数据库边处理层级了,先把TopCategory的所有数据一次性读到DataTable里,后续的层级遍历全在内存里搞,完全绕开DataReader的冲突问题。
示例代码:
// 先把所有分类数据加载到内存DataTable DataTable categoryTable = new DataTable(); using (SqlConnection conn = new SqlConnection("你的数据库连接字符串")) { string query = "SELECT Id, Name, ParentId FROM TopCategory"; SqlDataAdapter adapter = new SqlDataAdapter(query, conn); adapter.Fill(categoryTable); }
2. 用递归遍历分类树,构建带层级的下拉选项
有了内存里的DataTable,咱们写个递归方法,从顶级分类(ParentId为null或者0,看你表结构定义)开始,把所有父级、子分类都捋出来,还能给子分类加个缩进(比如--),让下拉框里的层级一目了然。
递归方法示例:
// 用来存最终的分类选项,用KeyValuePair存ID和显示名称 List<KeyValuePair<int, string>> categoryOptions = new List<KeyValuePair<int, string>>(); // 递归遍历构建分类树 void BuildCategoryHierarchy(int? parentId, string indent) { // 筛选当前父分类下的所有子分类 var childCategories = categoryTable.AsEnumerable() .Where(row => row.Field<int?>("ParentId") == parentId) .ToList(); foreach (var row in childCategories) { int catId = row.Field<int>("Id"); string catName = row.Field<string>("Name"); // 添加带缩进的选项,方便区分层级 categoryOptions.Add(new KeyValuePair<int, string>(catId, $"{indent}{catName}")); // 递归遍历当前分类的子分类,缩进再加一级 BuildCategoryHierarchy(catId, indent + "--"); } } // 启动递归,从顶级分类开始(这里假设ParentId为null是顶级,根据你的表结构调整) BuildCategoryHierarchy(null, "");
3. 把选项绑定到ComboBox
最后一步很简单,把咱们构建好的选项列表绑定到ComboBox就行:
yourComboBox.DataSource = categoryOptions; yourComboBox.DisplayMember = "Value"; // 显示带缩进的分类名称 yourComboBox.ValueMember = "Key"; // 存分类ID,后续关联产品用
额外提醒:关联RootCategory的需求
因为你的Products是和RootCategory绑定的,而RootCategory关联TopCategory的ParentId,要是需要确保下拉框里的分类都是和RootCategory挂钩的,那第一步的SQL查询可以加个关联条件,比如:
SELECT tc.Id, tc.Name, tc.ParentId FROM TopCategory tc INNER JOIN RootCategory rc ON tc.Id = rc.ParentId -- 要是RootCategory的ParentId关联的是TopCategory的父级ID,就调整JOIN条件哈
这样就能保证下拉框里的分类都符合业务关联要求啦!
内容的提问来源于stack exchange,提问作者Deeyo Pradhan
相关产品推荐
相关产品推荐

