【问题标题】:How to display data from a SQLite database into a GTK# TreeView?如何将 SQLite 数据库中的数据显示到 GTK# TreeView 中?
【发布时间】:2011-04-28 21:13:40
【问题描述】:

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

我需要在一个简单的网格视图中显示 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

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

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

【问题讨论】:

    标签: c# mono monodevelop gtk#


    【解决方案1】:

    我看到的和你一样,在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" );
      }
    

    【讨论】:

      【解决方案2】:

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

      最终编写了一个小函数,该函数获取选择查询返回的数据表并将其加载到树视图(dtResult,已使用设计器定义)

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

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

      【讨论】:

        猜你喜欢
        • 2019-08-05
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多