ASP.NET多行文本框多名称查询结果合并显示到GridView问题
解决GridView仅显示最后一条查询结果的问题
你的问题出在每次循环都重新给GridView绑定数据源,之前的查询结果会被覆盖,最终只保留最后一次循环的查询结果。要合并所有结果,应该一次性查询所有符合条件的记录,再绑定到GridView。
修改思路
- 先过滤掉TextBox中空的行,避免无效查询
- 构建参数化的IN查询语句(避免SQL注入风险)
- 一次性执行查询,将所有结果绑定到GridView
修改后的代码
protected void btntoplusorgu_Click(object sender, EventArgs e) { // 分割文本框内容并过滤空行 var satırlar = txttoplu.Text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); if (satırlar.Length == 0) { GridView1.DataSource = null; GridView1.DataBind(); return; } string baglanti = ConfigurationManager.ConnectionStrings["TAKS"].ConnectionString; using (SqlConnection con = new SqlConnection(baglanti)) { StringBuilder sbCommand = new StringBuilder("Select * from Veriler where Tckn IN ("); // 构建参数化的IN子句 for (int i = 0; i < satırlar.Length; i++) { string paramName = $"@Tckn{i}"; sbCommand.Append(paramName); if (i < satırlar.Length - 1) { sbCommand.Append(", "); } } sbCommand.Append(")"); SqlCommand cmd = new SqlCommand(sbCommand.ToString(), con); // 添加所有参数 for (int i = 0; i < satırlar.Length; i++) { cmd.Parameters.AddWithValue($"@Tckn{i}", satırlar[i].Trim()); } con.Open(); SqlDataReader rdr = cmd.ExecuteReader(); GridView1.DataSource = rdr; GridView1.DataBind(); } }
关键说明
- 使用
StringSplitOptions.RemoveEmptyEntries直接过滤空行,省去手动判断 - 采用参数化IN查询,每个值对应一个参数,彻底避免SQL注入
- 只创建一次连接和命令,一次性查询所有结果,再绑定到GridView,不会覆盖之前的数据
内容的提问来源于stack exchange,提问作者Harp
相关产品推荐
相关产品推荐

