c# - 将文本文件上传到数据表
问题描述
我试图允许用户将现有信息上传到数据表。以下是上传的代码:
private void label30_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
StreamReader read = new StreamReader(File.OpenRead(ofd.FileName));
string[] lines = File.ReadAllLines(ofd.FileName);
string[] values;
for (int i = 31; i < lines.Length; i++)
{
values = lines[i].ToString().Split(',');
string[] row = new string[values.Length];
for (int j = 0; j < values.Length; j++)
{
row[j] = values[j].Trim();
}
stkSheetdgv.Rows.Add(row);
read.Close();
read.Dispose();
}
}
}
文本文件中还有很多其他信息,因此是int i = 31
. 我越来越System.InvalidOperationException: 'Rows cannot be programmatically added to the DataGridView's rows collection when the control is data-bound.'
有人能告诉我这项工作缺少什么吗?如有必要,我可以为 dt 添加更多代码。让我知道。
stkSheetdgv.AutoGenerateColumns = false;
DataTable dt = new DataTable();
dt.Columns.Add("Wire", typeof(String));
dt.Columns.Add("Pole", typeof(String));
dt.Columns.Add("Primary Unit", typeof(String));
dt.Columns.Add("Down Guy", typeof(String));
dt.Columns.Add("Anchor", typeof(String));
dt.Columns.Add("Transformer", typeof(String));
dt.Columns.Add("Ground", typeof(String));
dt.Columns.Add("Riser/Disconnect", typeof(String));
dt.Columns.Add("Misc.", typeof(String));
DataGridViewComboBoxColumn wire = new DataGridViewComboBoxColumn();
var wirelist = new List<string>() {"AAC 1/0 POPPY", "AAC 477 COSMOS"};
wire.DataSource = wirelist;
wire.HeaderText = "Wire";
wire.DataPropertyName = "Wire";
DataGridViewComboBoxColumn pole = new DataGridViewComboBoxColumn();
var polelist = new List<string>() {"30C4 CCA", "30C5 CCA"};
pole.DataSource = polelist;
pole.HeaderText = "Pole";
pole.DataPropertyName = "Pole";
DataGridViewComboBoxColumn primary = new DataGridViewComboBoxColumn();
var primarylist = new List<string>() {"C1-LD", "C2-LD"};
primary.DataSource = primarylist;
primary.HeaderText = "Primary Unit";
primary.DataPropertyName = "Primary Unit";
DataGridViewComboBoxColumn down = new DataGridViewComboBoxColumn();
var downlist = new List<string>() {"E1-5-144", "E1-5-144P"};
down.DataSource = downlist;
down.HeaderText = "Down Guy";
down.DataPropertyName = "Down Guy";
DataGridViewComboBoxColumn anch = new DataGridViewComboBoxColumn();
var anchlist = new List<string>() {"F1-2 Expansion", "F1-2 Plate"};
anch.DataSource = anchlist;
anch.HeaderText = "Anchor";
anch.DataPropertyName = "Anchor";
DataGridViewComboBoxColumn trans = new DataGridViewComboBoxColumn();
var translist = new List<string>() { "G311-15kVA", "G311-25kVA"};
trans.DataSource = translist;
trans.HeaderText = "Transformer";
trans.DataPropertyName = "Transformer";
DataGridViewComboBoxColumn ground = new DataGridViewComboBoxColumn();
var groundlist = new List<string>() { "M2-12", "M2-11" };
ground.DataSource = groundlist;
ground.HeaderText = "Ground";
ground.DataPropertyName = "Ground";
DataGridViewComboBoxColumn rise = new DataGridViewComboBoxColumn();
var riserlist = new List<string>() { "M8-60-10'", "M8-100-10'"};
rise.DataSource = riserlist;
rise.HeaderText = "Riser/Disconnect";
rise.DataPropertyName = "Riser/Disconnect";
DataGridViewComboBoxColumn misc = new DataGridViewComboBoxColumn();
var misclist = new List<string>() { "M5-5LD", "M5-5HD"};
misc.DataSource = misclist;
misc.HeaderText = "Misc.";
misc.DataPropertyName = "Misc.";
stkSheetdgv.DataSource = dt;
stkSheetdgv.Columns.AddRange(wire, pole, primary, down, anch, trans, ground, rise, misc);
stkSheetdgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
解决方案
有两种不同的方法可以解决此问题,或者通过删除DataSource
(例如 remove stkSheetdgv.DataSource = dt;
) 在 上的分配DataGridView
,或者添加到DataSource
显式:
代码
private void label30_Click(object sender, EventArgs e)
{
DataTable dataTable = (DataTable)stkSheetdgv.DataSource;
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
using (StreamReader read = new StreamReader(File.OpenRead(ofd.FileName)))
{
string[] lines = File.ReadAllLines(ofd.FileName);
string[] values;
for (int i = 31; i < lines.Length; i++)
{
values = lines[i].ToString().Split(',');
var dataRow = dataTable.NewRow();
for (int j = 0; j < values.Length; j++)
{
dataRow[j] = values[j].Trim();
}
dataTable.Rows.Add(dataRow);
dataTable.AcceptChanges();
}
}
}
}
编辑
您收到错误的原因是 csv 的列多于DataTable
. 我使用的 CSV 文件是:
AAC 1/0 POPPY,30C4 CCA,C1-LD,E1-5-144,F1-2 Expansion,G311-15kVA,M2-12,M8-60-10',M5-5LD
AAC 477 COSMOS,30C5 CCA,C2-LD,E1-5-144P,F1-2 Plate,G311-25kVA,M2-11,M8-100-10',M5-5HD
这对我来说非常好。
推荐阅读
- reactjs - 如何使用 auth0 正确验证来自 React SPA 的 API 调用?
- canvas - 从 canvas.toDataURL() 创建图像 bloburl
- python - 转换 pandas 数据框并组合行
- google-api - YouTube API 请求因“未配置访问”而失败(也:“每天查询数”配额锁定为 0)
- solr - 如何在 Apache Solr 中添加多个负连接?
- javascript - 我想用子值检索firebase数据库数据
- elasticsearch - elasticsearch中_search查询结果中的总值显示什么?
- flutter - 两个颤振引擎如何相互通信
- asp.net-core - 从 Asp net core 2.2 迁移到 3.0 后,我看到 404 Not found
- c++ - 将图像魔法转换命令转换为魔法 ++ C++ 代码