将DataGridViewTextBoxCell转换为DatagridVIewButtonCell WinForms

时间:2015-07-28 08:04:27

标签: c# winforms datagridview

我需要在特定行上将DataGridViewTextBoxCell转换为DatagridVIewButtonCell。我尝试使用以下代码执行此操作:

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

但它没有用。有人知道可能是什么问题?绑定dataSource后,此行为已开始。

此外,我曾尝试创建新列及其工作,但我只需要按钮用于特定行,而不是所有列

 DataGridViewButtonColumn btnColumn = new DataGridViewButtonColumn();
            btnColumn.Name = "test";
            dataGridViewImport.Columns.Add(btnColumn);

所有数据绑定代码:

 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;
              }
        }
    }

2 个答案:

答案 0 :(得分:1)

我尝试使用一些更改代码(不知道你输错了某些名字或意图),如下所示,它可以工作。

    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()和DataGridView语句中的if

希望你能尽快解决:)

答案 1 :(得分:1)

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

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