4

情况:

你好!我正在尝试使用 MS Access 数据库填充 WPF 工具包 DataGrid。

这是我现在拥有的(它有效):

//Load the datagrid with the database
    private void LoadDataGrid(string filename, string path)
    {
        string databaseConn = "Provider=Microsoft.ACE.OLEDB.12.0;" +
                              "Data Source=" + path + "\\" + filename,
               tableName ="";
        OleDbConnection conn = null;
        DataTable schemaTable,
                  table = new DataTable();

        try
        {
            conn = new OleDbConnection(databaseConn);
            try
            {
                conn.Open();
                schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
                                                       new object[] { null, null, null, "TABLE" });
                tableName = "[" + schemaTable.Rows[0].ItemArray[2].ToString() + "];";
                string sqlQuery = "SELECT * FROM " + tableName;
                OleDbCommand command = new OleDbCommand(sqlQuery, conn);
                OleDbDataReader reader;
                reader = command.ExecuteReader();
                table.Load(reader);
                DataGrid_.ItemsSource = table.DefaultView;
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show(ex.Message); 
            }
            finally
            {
                conn.Close();
            }
        }
        catch (Exception ex)
        {
            System.Windows.MessageBox.Show(ex.Message); 
        }
    }

上面的代码示例在 MS Access 数据库的帮助下加载 WPF 工具包 DataGrid。

我想做的是能够在一开始就在 DataGrid 中插入一列。此列将用于写入行号。我认为可以修改变量(这是一个DataTable对象)。


问题:

那么,如何在变量中插入一列,为该新列中的每一行添加行号,并将数据库中的所有数据都保存在 DataGrid 中?

4

2 回答 2

2

您最简单的解决方案是修改您的代码以在原始 SELECT 查询中包含“虚拟”行号字段,如下所示:

SELECT ROWNUM AS ROWNUMBER, * FROM TABLE1

不幸的是,Access 没有类似 ROWNUM 函数的东西,所以我认为最简单的解决方案是在 SELECT 查询中添加一个 RowNumber 列,如下所示:

SELECT 0 AS ROWNUMBER, * FROM TABLE1

这将在开头添加一个包含全零的列,然后遍历生成的 DataTable 并设置行号,如下所示:

int rownumber = 1;
foreach (DataRow row in table.Rows)
{
    row["ROWNUMBER"] = rownumber;
    rownumber++;
}

然后将 DataTable 转储到网格中。

于 2009-08-15T21:19:01.013 回答
2

另一种方法是在将 IDataReader 加载到其中之前在 DataTable 上创建一个列。


// the rest of your code
//
DataTable table = new DataTable();
DataColumn col = table.Columns.Add("RowNumber", typeof(int));
col.AutoIncrementSeed = 1;
col.AutoIncrement = true;

//
// the rest of your code
//

table.Load(reader)
//
// the rest of your code

下面的代码片段演示了问题上下文之外的技术


//Simulates data coming from a database or another data source
DataTable origin = new DataTable(); 
DataColumnCollection columns = origin.Columns; 
columns.Add("Id", typeof(int)); 
columns.Add("Name", typeof(string)); 
origin.Rows.Add(55, "Foo"); 
origin.Rows.Add(14, "Bar"); 
IDataReader reader = origin.CreateDataReader();

DataTable table = new DataTable(); 

//Sets up your target table to include a new column for displaying row numbers
//These are the three lines that make it all happen.
DataColumn col = table.Columns.Add("RowNumber", typeof(int)); 
col.AutoIncrementSeed = 1; 
col.AutoIncrement = true; 

//Simulates loading data from the database
table.Load(reader); 

// Examine table through the debugger. Is will have the contents of "origin" with the column "RowNumber" prepended
于 2009-08-16T15:27:20.480 回答