C#DataGridView:如何更改单个单元格值

时间:2014-08-17 17:39:26

标签: c# datagridview cell streamreader streamwriter

我有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);
    }
}

2 个答案:

答案 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对应的RowIndexColumnIndex属性获取行和列。

您可以按照与文本相同的方式将它们提供给第二个表单,只是不要忘记创建适当的属性:

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的理解,可以尝试更改文件中的值,而不存储和完全重写其内容。