C# BackgroundWorker获取数据库并将其放入具有动态添加列的DataGrid中
我读到这个问题: 并且认为,这是解决这个问题的好办法。 唯一的问题是,我动态创建我的列 我从数据库中读取schemaInfo以获取列名,并为数据库中的每一列创建DataGridColumn 现在我想用BackgroundWorker来做这件事,但是你不能用BackgroundWorker来更新UI 目前(没有BackgroundWorker),我有两种方法来获取数据库值 要加载柱,请执行以下操作:C# BackgroundWorker获取数据库并将其放入具有动态添加列的DataGrid中,c#,wpf,datagrid,mysqldatareader,C#,Wpf,Datagrid,Mysqldatareader,我读到这个问题: 并且认为,这是解决这个问题的好办法。 唯一的问题是,我动态创建我的列 我从数据库中读取schemaInfo以获取列名,并为数据库中的每一列创建DataGridColumn 现在我想用BackgroundWorker来做这件事,但是你不能用BackgroundWorker来更新UI 目前(没有BackgroundWorker),我有两种方法来获取数据库值 要加载柱,请执行以下操作: using (MySqlDataReader reader = cmd.ExecuteReader
using (MySqlDataReader reader = cmd.ExecuteReader())
{
using (DataTable schema = reader.GetSchemaTable())
{
foreach (DataRow col in schema.Rows)
{
DataGridTextColumn column = new DataGridTextColumn();
string columnstring = col.Field<String>("ColumnName");
comboFilter.Items.Add(UppercaseFirst(columnstring));
column.Binding = new Binding(col.Field<String>("ColumnName"));
column.Header = UppercaseFirst(col.Field<String>("ColumnName"));
column.IsReadOnly = true;
Style textStyle = new Style(typeof(TextBlock));
textStyle.Setters.Add(new Setter(TextBlock.TextWrappingProperty, TextWrapping.Wrap));
column.ElementStyle = textStyle;
dataGridPrivatecustomers.Columns.Add(column);
}
}
}
因此,我尝试将两者结合在一起,并努力为DataGrad的ItemSource创建结果列表:
using (MySqlDataReader reader = cmd.ExecuteReader())
{
int i = 0;
while (reader.Read())
{
using (DataTable schema = reader.GetSchemaTable())
{
foreach (DataRow row in schema.Rows)
{
results.Add(new
{
});
i++;
}
}
}
}
问题是,我需要知道如何将ColumnName+值放入结果列表中
在相关问题中,他做到了
Id=rdr.GetInt32(0),
但是我不能执行row.Field(“ColumnName”)=reader[i].ToString()
代码也不知道要添加多少列,所以我想我需要另一个for或foreach循环?以及如何设置列名?我认为有些人也想知道这一点,因为(对我来说)对于不希望数据库中的列和值在后台工作人员的DataGrid中显示的新手开发人员来说,这看起来非常棘手 所以我将向你们展示,我是如何解决我的问题的 首先,我创建了一个列表来存储所有列名
private List<string> columnList = new List<string>();
我循环我的columnList中的所有项目,并为此列表中的每个项目创建一个DataGridTextColumn,并将其添加到我的DataGrid中
之后,所有列都添加到我的DataGrid中,我将DataGrid的ItemsSource设置为从worker\u DoWork
传递到worker\u RunWorker Completed
的DataTable
private List<string> columnList = new List<string>();
private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
using (MySqlConnection connection = new MySqlConnection(conf.connection_string))
{
if (OpenConnection(connection))
{
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.Connection = connection;
cmd.CommandText = string.Format("SELECT * FROM {0}", privateCustomerTablename);
using (MySqlDataReader reader = cmd.ExecuteReader())
{
using (DataTable schemaTable = reader.GetSchemaTable())
{
columnList.Clear();
foreach (DataRow row in schemaTable.Rows)
{
columnList.Add(row.Field<String>("ColumnName"));
}
}
}
using (MySqlDataAdapter dataAdapter = new MySqlDataAdapter(cmd.CommandText, connection))
{
using (DataTable dt = new DataTable())
{
dataAdapter.Fill(dt);
e.Result = dt;
}
}
}
connection.Close();
}
}
}
private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
foreach (var item in columnList)
{
DataGridTextColumn column = new DataGridTextColumn();
column.Binding = new Binding(item);
column.Header = UppercaseFirst(item);
column.IsReadOnly = true;
dataGridPrivatecustomers.Columns.Add(column);
}
DataTable dt = e.Result as DataTable;
dataGridPrivatecustomers.ItemsSource = dt.DefaultView;
}