如何从SQLite数据库显示数据到gtk# TreeView



操作系统:openSuse 11.4IDE: MonoDevelop 2.4.2使用GTK #

我需要在一个简单的网格视图中显示sqlite数据库的数据表,很像在WindowsForms/WPF的datagridview,但使用gtk#。我一直在尝试配置GTK。TreeView来正确显示数据,但运气不好。数据没有显示,我在Application输出中得到一个模糊的错误。下面是我的代码:

            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

我花了几个小时寻找有关这个问题的任何信息,但没有成功。令人惊讶的是,我没有发现在mono中使用treeview来显示数据库数据的例子,也没有发现任何关于gtk#的文档。

如何使我的网格视图工作?我实际上只需要它来显示数据并接受行选择(这样我就可以检查所选行的ID列)。

我看到的和你一样,遵循GtkSharp TreeView教程给出了完全相同的断言,树中没有数据。我认为断言是在转移注意力。在任何情况下,我得到了你的目标与以下代码。

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

我在寻找在GTK中使用树视图显示数据表的方法时偶然发现了这个线程。

最后写了一个小函数,它接受select查询返回的数据表并将其加载到treeview (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;
}

这只是一种快速探索数据集的方法,主要用于调试。请谨慎使用

最新更新