【问题标题】:Is there a way to programmatically call a checkbox and a column in a DataGridView?有没有办法以编程方式调用 DataGridView 中的复选框和列?
【发布时间】:2018-02-14 01:21:52
【问题描述】:

我正在制作一个 Excel 验证程序。导入后,将验证每列是否为小数。

复选框是动态生成的,并使用以下代码表示每个选项卡(选项卡是 Excel 文件中的工作表)数据表中的列:

int dynamicHeight = 0;
int padding = 10;

CheckBox[] chk = new CheckBox[dt.Columns.Count];

for (int i = 0; i <= dt.Columns.Count - 1; i ++)
{


    chk[i] = new CheckBox();
    chk[i].Name = dt.Columns[i].ColumnName;
    chk[i].Text = dt.Columns[i].ColumnName;
    chk[i].AutoCheck = true;
    chk[i].Bounds = new Rectangle(10, 20 + padding + dynamicHeight, 40, 22);
    panelCol.Controls.Add(chk[i]);
    dynamicHeight += 20;
    panelCol.Size = new Size(120, dynamicHeight);
    panelCol.Controls.Add(chk[i]);
    chk[i].Location = new Point(0, dynamicHeight);
    chk[i].Size = new Size(120, 21);
    panelCol.BackColor = Color.White;
    panelCol.AutoScroll = true;
    //panelCol.AutoScrollMinSize = new Size (0, 1200);
}

我想打电话给他们,但也动态地。我正在做的是手动像这样预设每个复选框:

chk[0].CheckedChanged += (s, e) =>
{
    decimal num;
    if (chk[0].Checked == true && chk[0].Name.Contains(dt.Columns[0].ColumnName))
    {
        //MessageBox.Show("HELLOW WORLD " + 0);

        for (int i = 0; i < dataGridView1.RowCount; i++)
        {
            if (!Decimal.TryParse(dataGridView1.Rows[i].Cells["January"].Value.ToString(), out num))
            {
                if (dataGridView1.Rows[i].Cells[dt.Columns["January"].ColumnName].Value.ToString() == null || dataGridView1.Rows[i].Cells[dt.Columns["January"].ColumnName].Value.ToString() == "")
                {

                }
                else
                {
                    MessageBox.Show(dataGridView1.Rows[i].Cells["January"].Value.ToString() + "  NOT A DECIMAL!");
                }

            }
            else
            {

            }
        }
    }
};

是否有针对此问题的修复或解决方案,以便我不必手动预设它们?导致如果 Excel 文件具有不同的列名,这意味着再次预设新列,该怎么办。

【问题讨论】:

  • 预设每个复选框是什么意思?你的意思是当它被检查时有一个特定的方法?
  • 也可以重构:if (String.IsNullOrEmpty(dataGridView1.Rows[i].Cells[dt.Columns["January"].ColumnName].Value.ToString() {}
  • 是的。当复选框被选中时,如果有一种方法无需在特定方法中输入它们。基本上想要的我想要的是这样的。如果选中复选框 January,则如果存在非十进制值,则将验证来自 DataTable 的列 January,而无需调用通过索引值或列名调用它们的特定方法。跨度>
  • 将复选框名称与列名称进行比较可能会完成该任务
  • 我不知道该怎么做。你可以解释吗?我是 C# 的新手。

标签: c# excel checkbox datagridview


【解决方案1】:
CheckBox[] chk = new CheckBox[dt.Columns.Count];
for (int i = 0; i <= dt.Columns.Count - 1; i ++)
{
    chk[i] = new CheckBox();
    chk[i].Name = dt.Columns[i].ColumnName;
    chk[i].Text = dt.Columns[i].ColumnName;
    chk[i].AutoCheck = true;
    chk[i].Bounds = new Rectangle(10, 20 + padding + dynamicHeight, 40, 22);
    panelCol.Controls.Add(chk[i]);
    dynamicHeight += 20;
    panelCol.Size = new Size(120, dynamicHeight);
    panelCol.Controls.Add(chk[i]);
    chk[i].Location = new Point(0, dynamicHeight);
    chk[i].Size = new Size(120, 21);
    panelCol.BackColor = Color.White;
    panelCol.AutoScroll = true;
    //panelCol.AutoScrollMinSize = new Size (0, 1200);

    chk[i].CheckedChanged += (s, ev) =>
    {
        decimal num;
        if (chk[i].Checked == true && chk[i].Name.Contains(dt.Columns[0].ColumnName))
        {
        //MessageBox.Show("HELLOW WORLD " + 0);

          for (int i = 0; i < dataGridView1.RowCount; i++)
            {
              if (!Decimal.TryParse(dataGridView1.Rows[i].Cells[chk[i].Name].Value.ToString(), out num))
                {
                  if (dataGridView1.Rows[i].Cells[dt.Columns[chk[i].Name].ColumnName].Value.ToString() == null || dataGridView1.Rows[i].Cells[dt.Columns[chk[i].Name].ColumnName].Value.ToString() == "")
                    {

                    }
                    else
                    {
                    MessageBox.Show(dataGridView1.Rows[i].Cells[chk[i].Name].Value.ToString() + "  NOT A DECIMAL!");
                    }

                 }
                 else
                 {

                  }
             }
         }
    };

}

这没有经过测试或任何东西,但它是您想要完成的基本概念。

【讨论】:

  • 我尝试使用代码,但在for (int i = 0; i &lt; dataGridView1.RowCount; i++) 中的一行中说它不能声明,因为它会给范围内已经存在的i 赋予不同的含义...跨度>
  • CheckedChanged 事件处理程序中的第二个 for 循环是问题所在。只需将 i 更改为另一个变量名称,例如 k。所以for (int k = 0; k &lt; dataGridView1.RowCount; k++)
  • 您好,我已将其全部更改为k,但仍有错误,介意您更新代码让我可视化您要说的内容吗? imgur.com/a/ix60m
  • 总列数是多少?该索引不应超出范围,因为它是由 db.Columns.Count - 1 指定的——老实说,如果没有进一步调查,我不太确定它是什么
  • 19 是总列。我不知道为什么会出现这个问题。 ://
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 2017-02-21
  • 1970-01-01
  • 2021-08-28
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多