0

每当我运行此代码时,我都会返回 - System.Data.DataRowView。我不明白什么问题。我试图在这里寻找解决方案,但我无法理解(我是编程新手..)。

public void loadLabels()
    {

        using (OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dbString))
        {
            connection.Open();


            String strDa = "SELECT Lessons.number, Lessons.type, Lessons.datel, Lessons.hour , Lessons.money, Lessons.note FROM Lessons";
            using (OleDbDataAdapter da = new OleDbDataAdapter(strDa, connection))
            {
                DataTable t = new DataTable();
                da.Fill(t);

                listBox1.DataSource = t;

            }

        }
    }
4

1 回答 1

1

ListBox 控件获取 DataTable 的每个元素并为其Items属性构建一个元素。但是当它添加一个元素时,它不知道应该在添加到集合的每个字符串中显示哪个数据库字段。在这种情况下,它使用用于添加元素的对象的 ToString 方法。在您的情况下,是 DataRowView 类的 ToString 方法。但是 DataRowView 类没有实现任何特定的 ToString() 方法,因此调用了基本实现 (object.ToString()),它只返回类的名称。

您可以使用属性更改此行为

 listBox1.DataSource = t;
 listBox1.DisplayMember = "datel";
 listBox1.ValueMember = "number";

这将只显示查询的一列。如果要显示多列,则有两个选项。放弃 ListBox 控件并使用 DataGridView(此站点中有很多示例,使用搜索功能)或在查询中创建别名以将多个字段连接在一起

String strDa = @"SELECT Lessons.number, Lessons.type, Lessons.datel, 
                Lessons.hour, Lessons.money, Lessons.note,
                Lessons.datel & ' ' & Lessons.hour & ' - ' & Lessons.money as LessonDetails
                FROM Lessons";

....
listBox1.DisplayMember = "LessonDetails";

这有点笨拙,并且产生的显示不是很整洁。我建议为此任务使用 DataGridView

于 2015-07-06T17:00:41.820 回答