操作系统: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;
}
这只是一种快速探索数据集的方法,主要用于调试。请谨慎使用