C#如何绑定文本框、下拉列表与SQL数据库实现搜索填充
核心需求
在文本框中输入用户姓名关键词,点击搜索按钮后,将匹配到的用户数据填充到下拉列表中。

现有实现代码
SQL Server 端计划使用的查询语句
SELECT Users.Forename + ' ' + Users.Surname AS [Name], Users.ID From Users Order by [Name]
Aspx 前端代码
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Page1.aspx.cs" Inherits="SearchRecords.WebForm1" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <p> Search User </p> <p> Filter Users: <asp:TextBox ID="TextBox1" runat="server" ></asp:TextBox> <asp:Button ID="SearchButton1" runat="server" Text="Search" OnClick="BtnSearch_Click" /> <br /> <br /> Select a user: <asp:DropDownList ID="DDLSelectUser1" runat="server"> </asp:DropDownList> <asp:Label ID="lblUserCount" runat="server" Text=""></asp:Label> <br /> <div class="DataGrid"> <asp:GridView ID="DataGrid1" runat="server" ShowHeaderWhenEmpty="false" EmptyDataText="No data found!"> </asp:GridView> </div> </p> <a href="Page1.aspx"> <p> Link to page 1 </p> </a> </div> </form> </body> </html>
C# 后端已编写的数据绑定方法
private void LoadIntoDropdown() { using (SqlConnection connection = new SqlConnection("Data Source=DEV-WEB;Initial Catalog=Isabelle;Integrated Security=True")) { connection.Open(); string sqlQuery = "SELECT Users.Forename + ' ' + Users.Surname AS [Name], Users.ID From Users WHERE Forename like '%'+@Forename+'%'"; using (SqlCommand cmd = new SqlCommand(sqlQuery, connection)) { cmd.Parameters.AddWithValue("Forename", TextBox1.Text); using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) { DataTable dt = new DataTable(); adapter.Fill(dt); DDLSelectUser1.DataTextField = "[Name]"; DDLSelectUser1.DataValueField = "Users.ID"; DDLSelectUser1.DataSource = dt; DDLSelectUser1.DataBind(); } } connection.Close(); } }
运行报错信息
"DataBinding: 'System.Data.DataRowView' does not contain a property with the name '[Name]'."
错误排查与修复方案
报错核心原因是下拉列表的字段绑定配置错误:
- SQL语句中包裹别名的方括号
[]是SQL Server的转义语法,仅在SQL语句内部生效,查询填充到DataTable后,实际的列名就是Name,不包含方括号。原代码写DataTextField = "[Name]"会让程序查找字面名称为[Name]的列,自然触发找不到属性的异常。 - 同理查询返回的ID列没有
Users.前缀,DataTable中的列名就是ID,原代码写DataValueField = "Users.ID"同样找不到对应列。
修正后的绑定代码
将数据绑定部分替换为以下内容即可解决当前报错:
adapter.Fill(dt); DDLSelectUser1.DataTextField = "Name"; DDLSelectUser1.DataValueField = "ID"; DDLSelectUser1.DataSource = dt; DDLSelectUser1.DataBind();
其他需要补全的逻辑
- 搜索按钮点击事件需要调用数据加载方法,否则点击搜索不会触发下拉列表填充,参考实现:
protected void BtnSearch_Click(object sender, EventArgs e) { LoadIntoDropdown(); // 可选:在标签上显示匹配到的用户总数 lblUserCount.Text = $"共找到{DDLSelectUser1.Items.Count}位匹配用户"; }
- 现有C#代码中的SQL查询缺少最初计划的排序逻辑,将sqlQuery变量替换为带排序的版本即可让返回的用户名按字母顺序排列:
string sqlQuery = "SELECT Users.Forename + ' ' + Users.Surname AS [Name], Users.ID From Users WHERE Forename like '%'+@Forename+'%' ORDER BY [Name]";
using代码块会在执行结束后自动释放并关闭数据库连接,不需要手动写connection.Close(),该代码属于冗余逻辑可直接删除。
内容的提问来源于stack exchange,提问作者LoaFia02
相关产品推荐
相关产品推荐

