我有2个表格。第一个表单包含datagridview,在第二个表单中,用户可以在第一个表单中更改datagridview中的单个值。问题是如果用户更改了值,其他单元格中的相同值也会更改。
前):
A B B C D
B B C D E
之后(如果我尝试在A到Z之后只改变一个B,它将改变所有B):
A Z Z C D
Z Z C D E
表格1:
private void callForm2(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.Show();
f2.Text = this.dataGridView1.CurrentCell.Value.ToString();
}
表格2:
private void button1_Click(object sender, EventArgs e)
{
string edit = File.ReadAllText(@"C:\Master.txt");
edit = edit.Replace(Text, textBox1.Text); //first Text = old value, textBox1 = new value
File.WriteAllText(@"C:\Master.txt", edit);
string message = "Item is modified on the list!";
string caption = "Success";
MessageBoxButtons button = MessageBoxButtons.OK;
MessageBoxIcon icon = MessageBoxIcon.Information;
MessageBox.Show(message, caption, button, icon);
this.Close();
//Changes Successfully, but if the cell value is same it changes all the same values
}
表单1从文本文件中获取数据
private void button1_Click(object sender, EventArgs e) //Add txt to program
{
if (File.Exists(@"C:\Master.txt")) //Look fot txt
{
using (StreamReader master = File.OpenText(@"C:\Master.txt")) //txt to table
{
int row = 0;
string s = String.Empty;
while ((s = master.ReadLine()) != null)
{
string[] columns = s.Split(',');
dataGridView1.Rows.Add();
for (int i = 0; i < columns.Length; i++)
{
dataGridView1[i, row].Value = columns[i];
}
row++;
}
}
}
else
{
string message = "Program was not able to find the text file.";
string caption = "Failed";
MessageBoxButtons button = MessageBoxButtons.OK;
MessageBoxIcon icon = MessageBoxIcon.Warning;
MessageBox.Show(message,caption,button,icon);
}
}
答案 0 :(得分:0)
通过执行edit = edit.Replace(Text, textBox1.Text);
,您将替换所有出现的字符/字符串...
试试这样的事情
var regex = new Regex(Regex.Escape("A"));
var newText = regex.Replace(Text, textBox1.text, 1);
希望这有帮助
答案 1 :(得分:0)
<强>问题:强>
当您的实际目标是在与DataGridView单元格对应的特定行上更改一个特定的逗号分隔值时,对文件的整个内容使用String.Replace
方法。
<强> SOLUTION:强>
要仅修改所需的字符串记录,您必须知道它存在于哪个行和列(在DGV和文本文件中)。您可以从this.dataGridView1.CurrentCell
对应的RowIndex
和ColumnIndex
属性获取行和列。
您可以按照与文本相同的方式将它们提供给第二个表单,只是不要忘记创建适当的属性:
f2.Text = this.dataGridView1.CurrentCell.Value.ToString();
f2.RowIndex = this.dataGridView1.CurrentCell.RowIndex;
f2.ColumnIndex = this.dataGridView1.CurrentCell.ColumnIndex;
public class Form2
{
public Int32 RowIndex {get; set;}
// ...
}
所以,现在您知道应该在什么位置进行更改。虽然可以手动遍历文件并仅为了简单而仅更改所需的值,但我建议您使用不同的方法:
不仅将数据加载到datagridview中,还将它们存储在相应的锯齿状数组中:
public class MyForm
{
// To store your currently loaded values
public List<String[]> Values{get; set;}
// Load button
...
using (StreamReader master = File.OpenText(@"C:\Master.txt")) //txt to table
{
this.values = new List<String[]>();
int row = 0;
string s = String.Empty;
while ((s = master.ReadLine()) != null)
{
string[] columns = s.Split(',');
// Save the line
values.Add(columns);
dataGridView1.Rows.Add();
for (int i = 0; i < columns.Length; i++)
{
dataGridView1[i, row].Value = columns[i];
}
row++;
}
}
然后在使用之前将此值列表提供给第二个表单:
...
f2.Values = this.values;
在form2 button1_Click:
private void button1_Click(object sender, EventArgs e)
{
this.Values[this.RowIndex][this.ColumnIndex] = textBox1.Text;
string edit = String.Join(
Environment.NewLine,
this.Values.
Select(array =>
String.Join(",", array)).
ToArray());
File.WriteAllText(@"C:\Master.txt", edit);
// ...
}
这不是最有效或最好的解决方案,但应该有效。
P.S。:如果您想提高对文件IO的理解,可以尝试更改文件中的值,而不存储和完全重写其内容。