ListBox绑定内连接查询结果显示System.Data.DataRowView问题排查
问题:WinForms ListBox绑定内连接查询结果后显示System.Data.DataRowView而非实际内容
在WinForms项目中,执行内连接查询后ListBox已获取到预期的2条数据,但无法正常显示内容,仅显示System.Data.DataRowView。查询语句已验证正确,排查DisplayMember设置问题两小时仍未解决。
相关代码
private void kryptonListBox1_SelectedIndexChanged(object sender, EventArgs e) { bolumsilbutton.Enabled = true; bolumuduzenlebutton.Enabled = true; bolumupbutton.Enabled = true; bolumdownbutton.Enabled = true; derseklebutton.Enabled = true; derslistbox.Enabled = true; if (Connection.DBPath == null) { //burada bölüm ismine göre veri çekilecek(veritabanı olmadan!) } else { try { OleDbConnection con = new OleDbConnection(); string query; con = Connection.GetConnection(); con.Open(); query = "SELECT Ders.ders_id, Ders.ders_ismi FROM Ders INNER JOIN (Bölüm INNER JOIN Bölüm_ders ON Bölüm.bolum_id = Bölüm_ders.bolum_id.Value) ON Ders.ders_id = Bölüm_ders.ders_id WHERE (((Bölüm.bolum_id)=" + bolumlerlistbox.SelectedValue.ToString() + "))"; OleDbDataAdapter da = new OleDbDataAdapter(query, con); DataSet ds = new DataSet(); da.Fill(ds, "Ders"); Connection.bolumlerform.derslistbox.DisplayMember = "Ders.ders_ismi"; Connection.bolumlerform.derslistbox.ValueMember = "Ders.ders_id"; Connection.bolumlerform.derslistbox.DataSource = ds.Tables["Ders"]; con.Close(); } catch (OleDbException ex) { MessageBox.Show("Veritabanına bağlanırken hata oluştu !" + ex.Message); } } }
解决方法
修正DisplayMember和ValueMember的取值
查询生成的DataTable中,列名是ders_id和ders_ismi(不带表前缀),因此需要修改设置为:Connection.bolumlerform.derslistbox.DisplayMember = "ders_ismi"; Connection.bolumlerform.derslistbox.ValueMember = "ders_id";调整绑定顺序(可选但推荐)
规范的绑定顺序应为先设置DataSource,再指定DisplayMember和ValueMember,避免潜在的绑定异常:Connection.bolumlerform.derslistbox.DataSource = ds.Tables["Ders"]; Connection.bolumlerform.derslistbox.DisplayMember = "ders_ismi"; Connection.bolumlerform.derslistbox.ValueMember = "ders_id";
原因分析
ListBox绑定DataTable时,DisplayMember需要指定的是DataTable中列的实际名称,而非SQL语句里的表名.列名格式。你的查询结果生成的DataTable中,列名仅保留了ders_id和ders_ismi,使用Ders.ders_ismi无法匹配到对应列,ListBox就会默认显示DataRowView对象的字符串表示,也就是System.Data.DataRowView。
额外优化:避免SQL注入风险
当前SQL语句直接拼接SelectedValue存在安全风险,建议改用参数化查询:
query = "SELECT Ders.ders_id, Ders.ders_ismi FROM Ders INNER JOIN (Bölüm INNER JOIN Bölüm_ders ON Bölüm.bolum_id = Bölüm_ders.bolum_id.Value) ON Ders.ders_id = Bölüm_ders.ders_id WHERE Bölüm.bolum_id = @BolumId"; OleDbDataAdapter da = new OleDbDataAdapter(query, con); da.SelectCommand.Parameters.AddWithValue("@BolumId", bolumlerlistbox.SelectedValue);
内容的提问来源于stack exchange,提问作者infinityosman
相关产品推荐
相关产品推荐

