C# BackgroundWorker获取数据库并将其放入具有动态添加列的DataGrid中

C# BackgroundWorker获取数据库并将其放入具有动态添加列的DataGrid中,c#,wpf,datagrid,mysqldatareader,C#,Wpf,Datagrid,Mysqldatareader,我读到这个问题: 并且认为,这是解决这个问题的好办法。 唯一的问题是,我动态创建我的列 我从数据库中读取schemaInfo以获取列名,并为数据库中的每一列创建DataGridColumn 现在我想用BackgroundWorker来做这件事,但是你不能用BackgroundWorker来更新UI 目前(没有BackgroundWorker),我有两种方法来获取数据库值 要加载柱,请执行以下操作: using (MySqlDataReader reader = cmd.ExecuteReader

我读到这个问题:

并且认为,这是解决这个问题的好办法。 唯一的问题是,我动态创建我的列

我从数据库中读取schemaInfo以获取列名,并为数据库中的每一列创建DataGridColumn

现在我想用BackgroundWorker来做这件事,但是你不能用BackgroundWorker来更新UI

目前(没有BackgroundWorker),我有两种方法来获取数据库值

要加载柱,请执行以下操作:

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