c# - C# 编辑 DataTable 更改未保存
问题描述
我有一个问题,我在一个类中创建了一个 DataTable 对象并将其返回给主程序。我调用了一个方法(1),它从数据表中检索一些信息,然后删除相同的行。然后我运行另一个方法 (2),它从列中检索数据,但我可以看到我在另一个方法 (1) 中删除的行没有生效。我已经计算了方法(1)中的行数,并且行数确实减少了,这表明它们已被删除。
这可能与引用对象有关吗?
对于我在提出这个问题时所犯的任何错误,请提前道歉。这是我对堆栈的第一个问题,我对编码还是很陌生。
提前致谢!
主程序:
filepath = @"E:\1802370 11.05.18 qCML 6x10E6 ERM_analysed.txt";
//Create a datatable from _analysed file and delete unwated columns
DataTable dataTable = csv.convertToDataTable(filepath);
//Assign slope and r2 values for both BCR and ABL
//Delete rows after
plate.getSlopeandR2(dataTable);
plate.getSampleList(dataTable);
数据表方法:
//Converts text file into a datatable to be manipluated.
public DataTable convertToDataTable(string filepath)
{
StreamReader sr = new StreamReader(filepath);
string[] headers = sr.ReadLine().Split('\t');
DataTable dt = new DataTable();
foreach (string header in headers)
{
dt.Columns.Add(header);
}
while (!sr.EndOfStream)
{
string[] rows = Regex.Split(sr.ReadLine(), "\t");
DataRow dr = dt.NewRow();
for (int i = 0; i < headers.Length; i++)
{
dr[i] = rows[i];
}
dt.Rows.Add(dr);
}
sr.Close();
return dt;
方法(1):获取值删除行
//Get slope and r2 values
//Delete rows after info is retrieved
public void getSlopeandR2(DataTable dataTable)
{
bool isABL = true;
List<int> rowsToDelete = new List<int>();
Console.WriteLine(dataTable.Rows.Count);
foreach (DataRow row in dataTable.Rows)
{
int rowIndex;
if (row["Well"].ToString() == "Slope" && isABL == true)
{
rowIndex = dataTable.Rows.IndexOf(row);
ablSlope = Convert.ToDouble(dataTable.Rows[rowIndex][1]);
ablR2 = Convert.ToDouble(dataTable.Rows[rowIndex + 2][2]);
isABL = false;
rowsToDelete.Add(rowIndex);
rowsToDelete.Add(rowIndex + 1);
rowsToDelete.Add(rowIndex + 2);
rowsToDelete.Add(rowIndex + 3);
rowsToDelete.Add(rowIndex + 4);
rowsToDelete.Add(rowIndex + 5);
}
else if (row["Well"].ToString() == "Slope" && isABL == false)
{
rowIndex = dataTable.Rows.IndexOf(row);
biomedSlope = Convert.ToDouble(dataTable.Rows[rowIndex][1]);
biomedR2 = Convert.ToDouble(dataTable.Rows[rowIndex + 2][2]);
rowsToDelete.Add(rowIndex);
rowsToDelete.Add(rowIndex + 1);
rowsToDelete.Add(rowIndex + 2);
rowsToDelete.Add(rowIndex + 3);
rowsToDelete.Add(rowIndex + 4);
rowsToDelete.Add(rowIndex + 5);
rowsToDelete.Add(rowIndex + 6);
}
}
for (int i = 0; i < rowsToDelete.Count; i++)
{
dataTable.Rows.RemoveAt(i);
}
Console.WriteLine(dataTable.Rows.Count);
}
方法(2):检索数据(仍包括已删除的行)
//Get unique list of sample ID's on plate
public void getSampleList(DataTable dataTable)
{
string tempValue;
foreach (DataRow row in dataTable.Rows)
{
if (!Samples.Contains(row["Sample Name"].ToString()))
{
tempValue = Convert.ToString(row["Sample Name"]);
Samples.Add(tempValue);
}
}
foreach (string id in Samples)
{
Console.WriteLine(id);
}
}
解决方案
有两种方法可以从 DataTable 中删除 DataRow。读取文件后,调用 AcceptChanges() 在内部提交 DataTable。
//Created new table sample
DataTable dt1 = new DataTable("dt1");
dt1.Columns.Add("Id", typeof(int));
dt1.Columns.Add("Name");
//Added dummy data
dt1.Rows.Add(1, "Abc");
dt1.Rows.Add(2, "Def");
//You must accept changes after reading file, so you can track changes
dt1.AcceptChanges();
//Below line will remove row permanently.
dt1.Rows.RemoveAt(0);
//Below line will mark row as deleted, still row count will be same till AcceptChanges() called.
dt1.Rows[0].Delete();
dt1.AcceptChanges();
推荐阅读
- c# - 在 Asp.Net Core 中进行模型验证之前修剪字符串
- c# - C#正则表达式用分隔符分割行,但忽略引号内的分隔符
- pandas - Matplotlib FuncAnimation 在类中实现时不绘制
- android-studio - 导航抽屉被我的屏幕文本覆盖
- javascript - React - 在重定向中将变量传递给路径
- java - 为什么 IDEA 显示“类型参数 'T' 不能直接实例化”。我想要做的是声明一个通用数组
- python - 使用 scipy 返回 NaN 的斜率
- python - 如何添加 s3fs、UpSetPlot、Matplotlib 作为 AWS lambda 层?
- javascript - 有没有办法让屏幕阅读器在渲染元素时只宣布一次?
- html - 如何编码此动画以匹配正确的事件