Cast DataGridViewTextBoxCell to DatagridVIewButtonCell WinFo

本文关键字:WinFo DatagridVIewButtonCell to DataGridViewTextBoxCell Cast | 更新日期: 2023-09-27 18:04:57

我需要将DataGridViewTextBoxCell转换为DatagridVIewButtonCell上的具体行。我尝试使用下面的代码来做到这一点:

foreach (DataGridViewRow row in dataGridViewImport.Rows)
{
      if(row.Cells["Active"].Value.Equals("false"))
      {
            DataGridViewButtonCell buttonCell = new DataGridViewButtonCell();
            row.Cells["check"] = buttonCell;
      }
}

但它没有工作。有人知道是什么问题吗?此行为在我绑定数据源后开始。

我也曾尝试创建新的列和它的作品,但我需要按钮仅为特定的行,而不是所有列

 DataGridViewButtonColumn btnColumn = new DataGridViewButtonColumn();
            btnColumn.Name = "test";
            dataGridViewImport.Columns.Add(btnColumn);
所有databindcode:

 public void prepareDataGridView()
        {
            dataTable = new DataTable();
            addColumnsToDataTable(dataTable);
            fillDataTable();
            dataGridViewImport.DataSource = dataTable;
            addHeaderCheckBox();
            addButtonsToUnactiveRows();
            styleDataGrid();      
        }

public void addColumnsToDataTable(DataTable dataTable)
        {
            dataTable.Columns.Add("check");
            dataTable.Columns.Add("Position");
            dataTable.Columns.Add("Positionsindex");
            dataTable.Columns.Add("Textindex");
            dataTable.Columns.Add("Stichwort");
            dataTable.Columns.Add("Menge");
            dataTable.Columns.Add("EH");
            dataTable.Columns.Add("Active");
        }
      private void fillDataTable()
    {
        //FILL DATA
    }   

public void addButtonsToUnactiveRows()
   {
     foreach (DataGridViewRow row in dataGridViewImport.Rows)
        {
              if(row.Cells["Active"].Value.Equals("false"))
              {
                    DataGridViewButtonCell buttonCell = new DataGridViewButtonCell();
                    row.Cells["check"] = buttonCell;
              }
        }
    }

Cast DataGridViewTextBoxCell to DatagridVIewButtonCell WinFo

我尝试了一些改变你的代码(不知道你是否打错了一些名字或有意的)如下,它工作。

    DataTable dataTable;
    private void Form1_Load(object sender, EventArgs e)
    {
        prepareDataGridView();
    }
    public void prepareDataGridView()
    {
        dataTable = new DataTable();
        addColumnsToDataTable(dataTable);
        fillDataTable();
        avaEditDataGridViewImport.DataSource = dataTable;
        //addHeaderCheckBox();
        addButtonsToUnactiveRows();
        //styleDataGrid();
    }

    public void addColumnsToDataTable(DataTable dataTable)
    {
        dataTable.Columns.Add("check");
        dataTable.Columns.Add("Position");
        dataTable.Columns.Add("Positionsindex");
        dataTable.Columns.Add("Textindex");
        dataTable.Columns.Add("Stichwort");
        dataTable.Columns.Add("Menge");
        dataTable.Columns.Add("EH");
        dataTable.Columns.Add("Active");
    }
    private void fillDataTable()
    {
        for (int j = 1; j <= 10; j++)
        {
            dataTable.Rows.Add(j.ToString(), j, j, j, j, j, j, (j % 2 == 0 ? true : false));
        }
    }
    public void addButtonsToUnactiveRows()
    {
        foreach (DataGridViewRow row in avaEditDataGridViewImport.Rows)
        {
            if (row.Cells["Active"].Value.ToString().Equals("False"))
            {
                DataGridViewButtonCell buttonCell = new DataGridViewButtonCell();
                row.Cells["check"] = buttonCell;
            }
        }
    }

你的代码和我的代码有一些不同之处:

  • 我没有使用addHeaderCheckBox()和styleDataGrid()(你没有在这里显示)

  • fillDataTable()的内部代码

  • addButtonsToUnactiveRows()中的DataGridViewif语句

希望你能尽快解决:)

问题是在事件处理,因为首先,我绑定数据,然后绘制DataGrid,然后尝试添加按钮。但是我需要在绘制之前添加按钮。所以我找到了这个事件的解决方案

private void dataGridViewImport_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            addButtonsToUnactiveRows();
        }