DataRelation между двумя таблицами данных - невозможно связать данные со списком (C # .NET 3.5) - PullRequest
1 голос
/ 20 января 2010

C # (.NET 3.5)

У меня есть база данных SQLite с двумя таблицами - сотрудники (первый столбец - id INTEGER PRIMARY KEY) и праздничные дни (id INTEGER - значение идентификатора сотрудника; начало DATE, конец DATE - не требует пояснений).

Моя форма содержит текстовые поля, флажки и т. Д. Для представления сведений о сотруднике, но, скажем, я также хотел бы получить список, в котором перечислены все выходные для выбранного сотрудника.

Так что мне нужно отношение данных, поскольку в окне списка должны отображаться только праздники по одному человеку за раз (идентификаторы в обеих таблицах данных должны совпадать).

        var command = new SQLiteCommand("SELECT * FROM employees; SELECT * FROM holidays");
        var connection=new SQLiteConnection(@"data source=C:\employees.db");
        command.Connection = connection;
        SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
        DataSet d = new DataSet();
        adapter.Fill(d);                        

        DataTable employees = d.Tables[0];

        // [...]
        // here I'm databinding my textboxes etc. to various columns 
        // of the employees data table - this works fine, navigation works well etc.
        // [...]

        DataTable holidays = d.Tables[1];            

        DataRelation relation;
        DataColumn master = employees.Columns[0];
        DataColumn slave = holidays.Columns[0];
        relation = new DataRelation("relation", master, slave);
        d.Relations.Add(relation);

        var dsView = holidays.DefaultView;
        listBox1.DisplayMember = "holidays.relation.start"; // <= it wouldn't look good like that of course, but I just want to get the thing to work for now
        listBox1.DataSource = dsView;
  • но все, что я получаю, это список, заполненный кучей "System.Data.DataRow" В этой реализации я пытался следовать учебному пособию, которое я нашел в Akadia ... Где я ошибаюсь? Спасибо

1 Ответ

2 голосов
/ 20 января 2010

Прежде всего, вы назвали переменные сотрудников и праздников, но это означает, что таблицы в наборе данных изменили имена;для них по-прежнему заданы имена по умолчанию, в вашем случае это table и table1.(Обычно это таблица, таблица1 ... таблицаN) Это означает, что ваше свойство элемента отображения должно быть следующим:

listBox1.DisplayMember = "table.relation.start";

Кроме того, убедитесь, что вы связываете данные с самим набором данных, а не с таблицей выходных в пределахнабор данных выглядит следующим образом:

listBox1.DataSource = d;

С этими двумя изменениями вы обнаружите, что он работает;this.BindingContext должен помочь в навигации по родительским записям, так как вы заметите, что в каждый момент времени отображается только 1 набор результатов дочерних (выходных).

Полный измененный код следующим образом:

    var command = new SQLiteCommand("SELECT * FROM employees; SELECT * FROM holidays");
    var connection=new SQLiteConnection(@"data source=C:\employees.db");
    command.Connection = connection;
    SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
    DataSet d = new DataSet();
    adapter.Fill(d);                        

    DataTable employees = d.Tables[0];

    // [...]
    // here I'm databinding my textboxes etc. to various columns 
    // of the employees data table - this works fine, navigation works well etc.
    // [...]

    DataTable holidays = d.Tables[1];

    DataRelation relation;
    DataColumn master = employees.Columns["id"];
    DataColumn slave = holidays.Columns["employeeid"];
    relation = new DataRelation("relation", master, slave);
    d.Relations.Add(relation);


    listBox1.DisplayMember = "table.relation.start"; // <= it wouldn't look good like that of course, but I just want to get the thing to work for now
    listBox1.DataSource = d;
...