如何将数据从SQLite数据库显示到GTK#TreeView中?
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列)。
我看到了和你一样的东西,在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");
}
你在哪里添加数据到ListStore?
看来你需要在while循环中使用AppendValues。
我偶然发现了这个线程,同时寻找一种方式来显示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;
}
这仅仅是探索一个快速的方法数据集,主要用于调试。请谨慎使用任何生产用途
啊谢谢你指出,我没有粘贴该线由于某种原因。现在修复。 – Kiril 2011-04-28 22:14:39
也许每行做一次AddAttribute而不是做一次就有问题了? – jpobst 2011-04-29 02:21:21