C# Asp.Net实现按用户拆分DataTable数据到独立GridView展示
实现按公司搜索并为每个用户生成独立GridView的方案
这个需求其实不难实现,核心思路是先定位目标公司下的所有唯一用户,再为每个用户动态创建GridView并绑定其对应的问卷记录。下面是具体的实现步骤和代码示例:
1. 页面布局准备
首先在你的.aspx页面上添加搜索控件和一个用来承载动态GridView的容器(比如Panel):
<div class="search-bar"> <asp:TextBox ID="txtCompany" runat="server" PlaceHolder="请输入公司名称"></asp:TextBox> <asp:Button ID="btnSearch" runat="server" Text="查询" OnClick="btnSearch_Click" CssClass="btn" /> </div> <asp:Panel ID="pnlGridViewContainer" runat="server" CssClass="grid-container"></asp:Panel>
2. 后台核心逻辑实现
在对应的.aspx.cs文件中,编写搜索按钮的点击事件,以及两个辅助方法:获取目标公司的唯一用户列表、获取单个用户的问卷记录。
protected void btnSearch_Click(object sender, EventArgs e) { string targetCompany = txtCompany.Text.Trim(); if (string.IsNullOrEmpty(targetCompany)) { // 提示用户输入公司名称 ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('请输入要查询的公司名称');", true); return; } // 获取该公司下的所有唯一用户 List<string> userList = GetUniqueUsers(targetCompany); // 清空容器,避免重复加载旧控件 pnlGridViewContainer.Controls.Clear(); if (userList.Count == 0) { pnlGridViewContainer.Controls.Add(new Label { Text = $"未找到公司「{targetCompany}」的任何问卷记录", CssClass = "empty-tip" }); return; } // 为每个用户生成独立的GridView foreach (string userName in userList) { // 添加用户标题,方便区分 Label userTitle = new Label(); userTitle.Text = $"<h4>{userName}的问卷记录</h4>"; pnlGridViewContainer.Controls.Add(userTitle); // 创建GridView控件 GridView userGv = new GridView(); userGv.ID = $"gv_{userName.Replace(" ", "_")}"; // 确保控件ID合法,替换空格为下划线 userGv.AutoGenerateColumns = false; userGv.CssClass = "user-grid"; // 自定义样式类 userGv.GridLines = GridLines.Both; userGv.HeaderStyle.CssClass = "grid-header"; userGv.RowStyle.CssClass = "grid-row"; // 添加绑定列 userGv.Columns.Add(new BoundField { DataField = "name", HeaderText = "姓名" }); userGv.Columns.Add(new BoundField { DataField = "company", HeaderText = "公司" }); userGv.Columns.Add(new BoundField { DataField = "question", HeaderText = "问题" }); userGv.Columns.Add(new BoundField { DataField = "answer", HeaderText = "回答" }); // 获取当前用户的问卷数据 DataTable userData = GetUserQuestionAnswers(targetCompany, userName); userGv.DataSource = userData; userGv.DataBind(); // 将GridView添加到容器中 pnlGridViewContainer.Controls.Add(userGv); // 添加分隔线,优化视觉效果 pnlGridViewContainer.Controls.Add(new LiteralControl("<hr class='divider' />")); } } // 辅助方法:获取指定公司下的所有唯一用户 private List<string> GetUniqueUsers(string company) { List<string> users = new List<string>(); string connStr = "你的数据库连接字符串"; // 替换为实际连接字符串 using (SqlConnection conn = new SqlConnection(connStr)) { string sql = "SELECT DISTINCT name FROM 你的问卷表名 WHERE company = @Company"; using (SqlCommand cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@Company", company); conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { users.Add(reader["name"].ToString().Trim()); } reader.Close(); } } return users; } // 辅助方法:获取指定公司和用户的所有问卷记录 private DataTable GetUserQuestionAnswers(string company, string userName) { DataTable dt = new DataTable(); string connStr = "你的数据库连接字符串"; // 替换为实际连接字符串 using (SqlConnection conn = new SqlConnection(connStr)) { string sql = @"SELECT name, company, question, answer FROM 你的问卷表名 WHERE company = @Company AND name = @Name"; using (SqlCommand cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@Company", company); cmd.Parameters.AddWithValue("@Name", userName); using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) { adapter.Fill(dt); } } } return dt; }
3. 样式优化(可选)
为了让页面更美观,可以添加一些CSS样式:
.search-bar { margin: 20px 0; } .btn { padding: 6px 12px; cursor: pointer; } .grid-container { margin-top: 20px; } .user-grid { width: 100%; margin: 10px 0; } .grid-header { background-color: #f2f2f2; font-weight: bold; padding: 8px; } .grid-row { padding: 8px; } .divider { border: none; border-top: 1px solid #eee; margin: 20px 0; } .empty-tip { color: #666; font-size: 16px; padding: 20px; }
注意事项
- 记得替换代码中的你的数据库连接字符串和你的问卷表名为项目中的实际值;
- 建议添加异常处理(比如try-catch块),处理数据库连接失败等异常情况;
- 如果目标公司下的用户数量过多,动态生成大量GridView可能会影响页面加载速度,可以考虑添加分页功能或者用折叠面板(比如Accordion控件)来展示每个用户的记录,优化用户体验;
- 使用参数化查询可以有效防止SQL注入,保障系统安全。
内容的提问来源于stack exchange,提问作者Pau Gacusan
相关产品推荐
相关产品推荐

