0

如何找到指定列和行的部分?

我有一个 datagridview 作为表格,如下图所示。

在此处输入图像描述

在 datagridview 中,单元格包含规则。(TE',1) 表示它是规则 TE',它是第一个规则。

我的任务就像我有一个表达式,例如 i+i*i,并使用第一列中显示的“规则”,我在 datagridview 中找到单元格的值,该列是表达式的第一个字符, which's row 是第二部分的第一个字符。我知道一开始这听起来很荒谬,但让我举个例子来说明这一点。

第一步是 (i+i*i#,E#,empty)。我检查第一部分的第一个字符i,检查第二部分的第一个字符E,查找列i和行E的部分。它是(TE',1),所以在开始步骤中,我将E替换为单元格值TE' ,并为第三部分添加数字1 ,该部分一开始是空的。现在实际的“公式”是这样的:

(i+i*i#,TE',1)

我用在单元格中找到的“规则”替换了第二部分,并将规则的编号添加到公式的第三部分。

下一步,我找到列i和行T的部分,它是(FT',4),所以我将T替换为FT',并将数字 4 添加到第三部分。

(i+i*i#, FT'E'#,14)

现在我寻找第i列和第F行的部分,即(i,8)。我再做一次更换。

(i+i*i#,iT'E'#,148)

现在对于第 i 列和第 i它是一个流行,所以我从公式中删除两者。

(+i*i#,T'E'#,148)

现在我寻找列+和行T' .......

当公式中只有#和数字时,整个过程结束,例如 (#,#,1942682)。

我这样填充了datagridview(对此我也很抱歉..):

private void AddRows()
    {
        string[] header_Row = new string[] { "", "+", "*", "(", ")", "i", "#", };
        dataGridView.Rows.Add(header_Row);

        string[] E_Row = new string[] { "E", "", "", "(TÉ,1)", "", "(TÉ,1)", "" };
        dataGridView.Rows.Add(E_Row);

        string[] EComma_Row = new string[] { "É", "(+TÉ,2)", "", "", "(Eps,3)", "", "(Eps,3)" };
        dataGridView.Rows.Add(EComma_Row);

        string[] T_Row = new string[] { "T", "", "", "(FT',4)", "", "(FT',4)", "" };
        dataGridView.Rows.Add(T_Row);

        string[] TComma_Row = new string[] { "T'", "(Eps,6)", "(+FT',5)", "", "(Eps,6)", "", "(Eps,6)" };
        dataGridView.Rows.Add(TComma_Row);

        string[] F_Row = new string[] { "F", "", "", "(E,7)", "", "(i,8)", "" };
        dataGridView.Rows.Add(F_Row);

        string[] emptyRow = new string[] { };
        dataGridView.Rows.Add(emptyRow);

        string[] Plus_Row = new string[] { "+", "pop", "", "", "", "", "" };
        dataGridView.Rows.Add(Plus_Row);

        string[] Star_Row = new string[] { "*", "", "pop", "", "", "", "" };
        dataGridView.Rows.Add(Star_Row);

        string[] StartingBracket_Row = new string[] { "(", "", "", "pop", "", "", "" };
        dataGridView.Rows.Add(StartingBracket_Row);

        string[] EndingBracket_Row = new string[] { ")", "", "", "", "pop", "", "" };
        dataGridView.Rows.Add(EndingBracket_Row);

        string[] i_Row = new string[] { "i", "", "", "", "", "pop", "" };
        dataGridView.Rows.Add(i_Row);

        string[] Hashmark_Row = new string[] { "#", "", "", "", "", "", "Elfogad" };
        dataGridView.Rows.Add(Hashmark_Row);
    }

所以问题是,如果我有第一个公式(i+i*i#,E#,empty),如何在 datagridview 中搜索i列和E行的部分,以获取该单元格的值?

4

2 回答 2

1

我不会尝试遵循您的程序正在执行的逻辑,而是要获取每个单元格的值,我将以下示例放在一起:

这将填充两行网格。单击按钮时,它将遍历 datagridview 的行和列,并显示带有索引和单元格值的消息。

private void Form1_Load(object sender, EventArgs e)
{ 
    string[] row1 = new string[] { "A1", "A2", "A3" };
    string[] row2 = new string[] { "B1", "B2", "B3" };

    dataGridView1.Rows.Add(row1);
    dataGridView1.Rows.Add(row2);
    dataGridView1.Refresh();
}

private void button1_Click(object sender, EventArgs e)
{
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        foreach(DataGridViewColumn col in dataGridView1.Columns)
        {
            string s = string.Format("I am at row {0} , col{1} the value is {2}", row.Index, col.Index, (string)dataGridView1.Rows[row.Index].Cells[col.Index].Value);
            MessageBox.Show(s);
         }
    }
}

单元格的值,当访问时将是一个对象。这就是为什么我在循环内的线上有一个字符串。您只需要知道行索引和列索引。第一列和第一行从 0 开始。

于 2019-11-24T22:28:24.147 回答
0

如果您只想遍历第一行,只需使用 0 作为索引。foreach(DataGridViewColumn col in dataGridView1.Columns) string cellValue = (string)dataGridView1.Rows[0].Cells[col.Index].Value)

您实际上可以编写一个方法,如下所示,如果您传入无效的行或列,它将返回 null,否则它将返回单元格内容的字符串值。这是假设您所有的数据都是字符串。

然后,您只需调用它:

  string s = GetCellValue(row, col);


   string GetCellValue(int row, int col)
   {

   try
    {
      return (string)dataGridView1.Rows[row].Cells[col].Value);
    }
    catch
    {
        return null;
    }
   }
于 2019-11-24T23:46:42.130 回答