System.Data.DataRowView C#

Всякий раз, когда я запускаю этот код, я возвращаюсь - 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;

            }

        }
    }

1 ответ

Решение

Элемент управления ListBox берет каждый элемент вашей DataTable и создает элементы для его свойства Items. Но когда он добавляет элемент, он не знает, какое из полей вашей базы данных должно отображаться в каждой из строк, добавляемых в коллекцию. В этом случае он использует метод ToString объекта, используемого для добавления элементов. В вашем случае это метод ToString класса DataRowView. Но класс 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 для этой задачи

Другие вопросы по тегам