You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
        }
    }
}

解决方法

  1. 修正DisplayMember和ValueMember的取值
    查询生成的DataTable中,列名是ders_id和ders_ismi(不带表前缀),因此需要修改设置为:

    Connection.bolumlerform.derslistbox.DisplayMember = "ders_ismi";
    Connection.bolumlerform.derslistbox.ValueMember = "ders_id";
    
  2. 调整绑定顺序(可选但推荐)
    规范的绑定顺序应为先设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:50:24