我有一个DataGridView,其中包含使用以下代码从.csv文件成功导入的数据。 DGV中的列可以由用户重新排序。我需要使用列'将数据导出到SQL Server数据库。 DisplayIndex订单而不是索引订单。
private void btn_Upload_Click(object sender, EventArgs e)
{
char colDelimiter = ',';
char rowDelimiter = '\r';
DataTable dataTable = new DataTable();
OpenFileDialog getFile = new OpenFileDialog();
getFile.Filter = "CSV Files (*.csv)|*.csv|All Files (*.*)|*.*";
getFile.FilterIndex = 1;
if(getFile.ShowDialog() == DialogResult.OK)
{
string fileName = getFile.FileName;
TextReader reader = new StreamReader(getFile.FileName);
string[] columns = reader.ReadLine().Split(colDelimiter);
int x = 0;
foreach(string c in columns)
{
dataTable.Columns.Add(columns[x]);
x += 1;
}
x = 0;
string[] rows = reader.ReadToEnd().Split(rowDelimiter);
foreach (string r in rows)
{
string[] record = r.Split(colDelimiter);
dataTable.Rows.Add(record);
}
this.dataGridView1.DataSource = dataTable;
MessageBox.Show(fileName + " was successfully imported.");
}
答案 0 :(得分:0)
不幸的是,这是我所知道的最佳解决方案:根据dataGridView显示的表创建一个新表。然后用新的DataTable替换原始DataTable。我假设你在这个例子中有一些名为table的DataTable。
希望这会有所帮助,我希望有一种更简单的方法,但如果您正在执行大型Update()命令,这是我所知道的最简单的方法。
如果你正在做一些用SQL查询手动更新每一行的东西,你可以确保更新基于DisplayIndex和DataGridView,而不是直接基于DataTable。
//Make a new DataTable
DataTable newTable = new DataTable();
//Create Columns based on DataGridView headers
foreach (DataGridViewColumn col in dataGridView1.Columns)
{
newTable.Columns.Add(col.HeaderText);
}
//Add each row of data from DataGridView into new DataTable in the displayed order
foreach (DataGridViewRow row in dataGridView1.Rows)
{
DataRow newRow = newTable.NewRow();
foreach(DataGridViewCell cell in row.Cells)
{
newRow[cell.ColumnIndex] = cell.Value;
}
newTable.Rows.Add(newRow);
}
//Set your original DataTable to the new DataTable with the correct ordering
table = newTable;
答案 1 :(得分:0)
另外,作为一个注释,我正在研究你最初如何加载.csv ...
我有类似的东西我基于分隔符进行拆分,我只是确保包含一个Schema.ini来加载我的.csv,然后使用ADO命令填充DataTable。这对我来说似乎更快。
请参阅以逗号分割的Schema.ini:
[tempdata.csv]
Format=Delimited(,)
ColNameHeader=True
MaxScanRows=0
这是#include命令:
using System.Data.OleDb;
以下是使用dataAdapter Fill()填充我的DataTable的C#代码,将绑定源设置为DataTable,然后将dataGridView的DataSource设置为绑定源:
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + workingPath + ";Extended Properties=\"text;HDR=YES;FMT=Delimited(|)\"";
using (OleDbConnection conn = new OleDbConnection(connString))
{
using (OleDbCommand cmd = new OleDbCommand("SELECT * FROM " + workingFilename, conn))
{
conn.Open();
OleDbDataAdapter dAdapter = new OleDbDataAdapter(cmd);
originalTable = new DataTable("");
dAdapter.Fill(originalTable);
}
}