2011-04-28 198 views
2

OS:OpenSUSE 11.4中 IDE:MonoDevelop的2.4.2 使用GTK#如何将数据从SQLite数据库显示到GTK#TreeView中?

我需要一个简单的网格视图中显示SQLite数据库的数据表,很像WindowsForms'/WPF的datagridview的,但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#的任何文档的例子。

如何让我的网格视图工作?我真的只需要它显示数据并接受行选择(以便我可以检查所选行的ID列)。

回答

2

我看到了和你一样的东西,在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

你在哪里添加数据到ListStore?

看来你需要在while循环中使用AppendValues。

+0

啊谢谢你指出,我没有粘贴该线由于某种原因。现在修复。 – Kiril 2011-04-28 22:14:39

+0

也许每行做一次AddAttribute而不是做一次就有问题了? – jpobst 2011-04-29 02:21:21

0

我偶然发现了这个线程,同时寻找一种方式来显示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; 
} 

这仅仅是探索一个快速的方法数据集,主要用于调试。请谨慎使用任何生产用途