2011-04-28 117 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; 
} 

這僅僅是探索一個快速的方法數據集,主要用於調試。請謹慎使用任何生產用途

相關問題