Как отобразить данные из базы данных SQLite в GTK # TreeView? - PullRequest
2 голосов
/ 29 апреля 2011

ОС: openSuse 11.4 IDE: MonoDevelop 2.4.2 с использованием GTK #

Мне нужно отобразить данные базы данных sqlite в простом представлении сетки, как в представлении данных WindowsForms / WPF, но с GTK#.Я пытался настроить GTK.TreeView для правильного отображения данных, но безуспешно.Данные не отображаются, и я получаю неясную ошибку в выходных данных приложения.Вот мой код:

            Type[] types;           
            SqliteCommand cmd = new SqliteCommand("SELECT * FROM "+Tables.USERS, _cddapConn);
            cmd.Connection.Open();
            SqliteDataReader reader = cmd.ExecuteReader();
            types = new Type[reader.FieldCount];        


        for(int i = 0; i < types.Length; i++)
            types[i] = typeof(string);
        Gtk.ListStore list = new Gtk.ListStore(types);

        for(int i = 0; i < TblUsers.SCHEMA.Length; i++)
        {               
            table.AppendColumn(TblUsers.SCHEMA[i], new Gtk.CellRendererText(), "text");
        }
while(reader.Read())
        {
            String[] rowData = new String[TblUsers.SCHEMA.Length];
            for(int index = 0; index < TblUsers.SCHEMA.Length; index++)
            {
                rowData[index] = reader.GetString(index);                   
                table.Columns[index].AddAttribute(new Gtk.CellRendererText(), "text", index);

                }
                list.AppendValues(rowData);


        }
        table.Model = list;
        reader.Close();
        cmd.Connection.Close();

Я следовал приведенному здесь примеру: http://www.mono -project.com / GtkSharp_TreeView_Tutorial .Сначала я создаю модель (ListStore), инициализируя ее строковым типом для данных каждого столбца.Затем я добавляю столбцы таблицы данных в древовидное представление.Затем я включаю программу чтения sqlite и для каждой записи добавляю свои данные в модель.Затем я добавляю ячейку для каждого столбца, указывающую на данные.Наконец, я даю древовидному представлению его модель.

Однако, это удается только для отображения столбцов без данных.В выводе приложения я получаю следующее:

Gtk-CRITICAL **: gtk_tree_view_column_cell_layout_add_attribute: assertion `info != NULL' failed

Я потратил несколько часов на поиск информации об этой проблеме, но безуспешно.Что удивительно, так это то, что я не нашел примеров использования дерева в моно для отображения данных из базы данных или какой-либо документации по gtk # по этому вопросу.

Как я могу заставить мой вид сетки работать?Мне действительно нужно только отображать данные и принимать выбор строк (чтобы я мог проверить столбец идентификатора выбранной строки).

Ответы [ 2 ]

2 голосов
/ 02 октября 2011

Я видел то же, что и вы, после GtkSharp TreeView Tutorial дает точно такое же утверждение и никаких данных в дереве. Я думаю, что Assert - красная сельдь. В любом случае я получил то, к чему вы стремились, с помощью следующего кода.

  ListStore SetupModel( TreeView tv ){
    var m = new ListStore(typeof(string),typeof(string));

    var nameCol = new TreeViewColumn( "Name", 
      new CellRendererText(), "text", 0 );
    tv.AppendColumn( nameCol );

    var colourCol = new TreeViewColumn( "Colour", 
      new CellRendererText(), "text", 1 );
    tv.AppendColumn( colourCol );

    tv.Model = m;
    return m;
  }

  void PopulateData( ListStore model ) {
    model.AppendValues( "Fred", "Blue" );
    model.AppendValues( "Bob", "Green" );
    model.AppendValues( "Mary", "Yellow" );
    model.AppendValues( "Alice", "Red" );
  }
0 голосов
/ 01 мая 2017

Я наткнулся на эту тему, ища способ отображения данных в GTK с древовидной структурой.

Закончилось написание небольшой функции, которая берет таблицу данных, возвращенную запросом выбора, и загружает ее в древовидную структуру (dtResult, уже определенную в Designer)

private void loadResults(ref DataTable table)
{
    //Remove previous model
    foreach (var col in dtResult.Columns)
    {
        dtResult.RemoveColumn(col);
    }

    //Set the number of columns to type string 
    //(could use Row.DataType, but would require some work when adding values)
    List<System.Type> colTypes = new List<System.Type>();
    for (int col_it = 0; col_it < table.Columns.Count; col_it++)
    {
        colTypes.Add(typeof(string));
    }
    ListStore resultListStore = new ListStore(colTypes.ToArray());

    //Adding columns
    for (int col_it = 0; col_it < table.Columns.Count; col_it++)
    {
        dtResult.AppendColumn(table.Columns[col_it].ColumnName, new CellRendererText(), "text", col_it);
    }

    //Adding values
    List<string> rowValues = new List<string>();
    for (int row_it = 0; row_it < table.Rows.Count; row_it++)
    {
        for (int col_it = 0; col_it < table.Columns.Count; col_it++)
        {
            rowValues.Add(table.Rows[row_it][col_it].ToString());
        }
        resultListStore.AppendValues(rowValues.ToArray());
        rowValues.Clear();
    }

    //updating model
    dtResult.Model = resultListStore;
}

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

...