【发布时间】:2019-11-26 14:17:31
【问题描述】:
我得到的程序能够将 CSV 和 Excel 文件加载到数据网格视图中。 除了 CSV 文件保留旧数据外,这工作得很好。
例如,CSV 文件有 30 个值。我将数据加载到datagridview中,它工作正常。 我关闭应用程序,然后编辑删除 26 行的 CSV 文件。下次我打开应用程序并加载文件时,即使该文件不再存在,它仍然会得到具有 30 个值的版本。
为了清楚起见,我在记事本中打开并编辑文件,它按预期工作,但即使在记事本中编辑后,我的 Winform 应用程序似乎也加载了以前的版本。即使我重命名文件,它仍然需要不再存在的数据。即使在完全重新启动 PC 后,该文件仍会保留不应该存在的数据。 但是!如果我将文件移动到不同的文件夹(添加新文件夹并将其放入其中),它会加载新数据...
编辑: 似乎它实际上正在加载文件夹中的所有 CSV 文件。 (包括旧版本)
什么可能导致这个问题?看到 Excel 文件没有遇到这个问题。
使用的代码:
private void OpenExcel()
{
OpenFileDialog openFileDialog1 = new OpenFileDialog
{
InitialDirectory = @"C:\",
Title = "Browse Text Files",
CheckFileExists = true,
CheckPathExists = true,
DefaultExt = "txt",
FilterIndex = 2,
RestoreDirectory = true,
ReadOnlyChecked = true,
ShowReadOnly = true,
Filter = "Excel Worksheets|*.csv"
};
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
FileLocation = openFileDialog1.FileName;
GetExcelSheetNames(openFileDialog1.FileName);
MyConnection = new OleDbConnection(connString);
MyCommand = new OleDbDataAdapter("select * from [" + SheetName + "]", MyConnection);
MyCommand.TableMappings.Add("Table", "TestTable");
Datatable_Temp = new DataTable();
MyCommand.Fill(Datatable_Temp);
MyConnection.Close();
}
else
{
Canceled = true;
}
}
private string GetExcelSheetNames(string excelFile)
{
OleDbConnection objConn = null;
DataTable dt = null;
string CSVOrNot = excelFile.Substring(excelFile.Length - 3);
try
{
// Connection String.
if (CSVOrNot == "csv")
{
connString = string.Format(@"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=YES;FMT=Delimited""", Path.GetDirectoryName(excelFile));
}
else
{
connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + excelFile + ";Extended Properties=Excel 12.0;";
}
// Create connection object by using the preceding connection string.
objConn = new OleDbConnection(connString);
// Open connection with the database.
objConn.Open();
// Get the data table containg the schema guid.
dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
if (dt == null)
{
MessageBox.Show("No Data Found");
return null;
}
SheetName = dt.Rows[0]["TABLE_NAME"].ToString();
return SheetName;
}
catch
{
return null;
}
finally
{
// Clean up.
if (objConn != null)
{
objConn.Close();
objConn.Dispose();
}
if (dt != null)
{
dt.Dispose();
}
}
}
【问题讨论】:
-
您对 CSV 文件的更改真的得到保存了吗?您确定要加载更改后的文件吗?
-
确保应用程序没有保存 xlsx 而不是 csv。保存在哪里?您正在使用 oledb,并且必须使用 Update 或 Insert 写回数据。
-
@MarkusDeibel 我确实使用记事本将其保存为 CSV 文件。如果我在记事本或 Excel 中打开文件,该文件已经完成了它应该做的事情,但由于某种原因,我的 Winforms 继续加载不再存在的文件。就像它在某种缓存中一样。
-
“显示的代码是所用代码的全部”——当然不是。至少,它缺少程序中使用的各种变量的声明。它需要外部设置,例如 CSV 文件本身,当然还有 Excel 安装。如果没有 Excel 就无法重现这一点,那么这实际上更像是一个 Excel 用户问题,而不是一个编程问题。
-
@A.bakker:忽略发布完整代码的请求并不方便我们为您提供帮助。