-1

我读了这个问题:BackgroundWorker to read database and update GUI

并认为,这是解决这个问题的好方法。唯一的事情是,我动态地创建了我的列。

我从数据库中读取 schemaInfo 以获取 ColumnNames 并在数据库中为每个列创建一个 DataGridColumn。

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

现在(没有 BackgroundWorker)我有 2 种方法来获取数据库值。

要加载列:

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

加载值

using (MySqlDataAdapter dataAdapter = new MySqlDataAdapter(string.Format("SELECT * FROM {0}", privateCustomerTablename), connection))
                        {
                            using (DataTable dt = new DataTable())
                            {
                                dataAdapter.Fill(dt);
                                dataGridPrivatecustomers.ItemsSource = dt.DefaultView;
                            }
                        }

因此,我尝试将两者合二为一,并努力为 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 + Value 放入结果列表中。

在链接的问题中,他做了 Id = rdr.GetInt32(0),

但我做不到row.Field<String>("ColumnName") = reader[i].ToString() 代码也不知道要添加多少列,所以我想我需要另一个 for 或 foreach 循环?以及如何设置 ColumnName ?

4

1 回答 1

0

我认为有些人也想知道这一点,因为(对我而言)对于不希望数据库中的列和值在具有 BackgroundWorker 的 DataGrid 中显示的初学者来说,这看起来真的很棘手。

所以我会告诉你,我是如何解决我的问题的。

首先,我创建了一个列表来存储所有列名。

private List<string> columnList = new List<string>();

之后,我编辑了 worker_DoWork 事件,如下所示:

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

首先,您可以看到我制作了一个 DataReader 来读取 DataBase 模式并将其存储在 DataTable 中,这样我就可以通过 foreach 循环对其进行循环。在这个循环中,我将 schemaTable 中的每个项目添加到我的列表中,以便列表包含所选数据库表的所有列名。

之后,我创建了一个 DataAdapter 并将内容存储到另一个 DataTable。我将这个 DataTable 传递e.Result = dtworker_RunWorkerCompleted Event. 现在我想在我的worker_RunWorkerCompleted Event.

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

我循环我的 columnList 中的所有项目,并为此列表中的每个项目创建一个 DataGridTextColumn 并将其添加到我的 DataGrid。

之后,所有列都添加到我的 DataGrid 中,并将我的 DataGrid 的 ItemsSource 设置为我从worker_DoWorkto传递的 DataTable worker_RunWorkerCompleted

于 2017-10-24T13:47:04.987 回答