1

我有一个数据网格视图,其 ReadOnly 设置为 true 以防止人们进行编辑。

然后我在每一行都有一个按钮。当我点击一个特定的按钮时,我写道:

private void DGGrade_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.RowIndex > 0 && e.ColumnIndex == DGGrade.Columns["Edit"].Index)
        {

            DGGrade.Rows[DGGrade.CurrentCell.RowIndex].ReadOnly = false;

            DGGrade.Rows[DGGrade.CurrentCell.RowIndex].DefaultCellStyle.BackColor = Color.White;
        }

但它不起作用。请帮忙

4

1 回答 1

2

我不知道它为什么不起作用的原因,但据我从我的测试运行中可以看出,它必须处理数据的绑定方式。如果您使用dataGridView1.DataSource = GetDataSource();,那么它在我的测试中不起作用。我曾经读过一次关于自动绑定的一些缺点,但我找不到它。这是有效的代码。只有在用户单击相应行中EditMode的按钮后,才会出现一行。Edit我稍后会回来 - 如果您需要更多指示,请告诉我。

public partial class Form1 : Form
{
    int rowIndexOfEditableRow = -1;
    public Form1() {
       InitializeComponent();           
       CreateDataGridView(dataGridView1);
       SetExistingDataGridViewRowsReadOnly();           
       this.dataGridView1.Columns.Add(GetBtnColumn());          
    }

    private void SetExistingDataGridViewRowsReadOnly() {
        DataGridViewRowCollection rows = this.dataGridView1.Rows;
        foreach (DataGridViewRow row in rows) {
            row.ReadOnly = true;
        }
    }

似乎必须手动填充网格 - 至少这种方式 ReadOnly 的变化有效

public void CreateDataGridView(DataGridView dgv) 
{                   
   dgv.ColumnCount = 3;
   dgv.Columns[0].Name = "Id";
   dgv.Columns[1].Name = "Lastname";
   dgv.Columns[2].Name = "City";
   dgv.BackgroundColor = Color.Gray;                        
   AddRowsToDataGridView(dgv);          
}


private void AddRowsToDataGridView(DataGridView dgv)
{
  string[] row1 = new string[]{"1", "Muller", "Seattle"};
  string[] row2 = new string[]{"2", "Arkan", "Austin"};
  string[] row3 = new string[]{"3", "Cooper", "New York"};        
  object[] rows = new object[] { row1, row2, row3 };

  foreach (string[] rowArray in rows)
  {
    dgv.Rows.Add(rowArray);
  }
}

使用按钮创建列的辅助方法

    public DataGridViewButtonColumn GetBtnColumn()
    {       
      DataGridViewButtonColumn btnColumn = new DataGridViewButtonColumn();
      btnColumn.HeaderText = "Edit";
      btnColumn.Text = "Edit";
      btnColumn.UseColumnTextForButtonValue = true;            
      return btnColumn;
    }

事件处理程序检查用户是否单击了编辑按钮。在这种情况下,当前行将设置为ReadOnly = false。这允许用户编辑行。为了强调它,我改变了行的背景颜色。

    private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) 
    {
      int colIndex = e.ColumnIndex;
      int rowIndex = e.RowIndex;
      Type cellType =   dataGridView1.Columns[colIndex].CellType;
      if (cellType == typeof(DataGridViewButtonCell))               
      {
        dataGridView1.Rows[rowIndex].ReadOnly = false;
        dataGridView1.Rows[rowIndex].DefaultCellStyle.BackColor = Color.GreenYellow;
        this.rowIndexOfEditableRow = rowIndex;
        label1.Text = rowIndexOfEditableRow.ToString() + " " + colIndex.ToString();
      }             
    }

如果触发了 Row-leave-Event,则样式被重置,并且可编辑行的全局参数设置为初始值

    private void DataGridView1_RowLeave(object sender, DataGridViewCellEventArgs e) 
    {
      int rowIndex = e.RowIndex;
      dataGridView1.Rows[rowIndex].ReadOnly = true;
      dataGridView1.Rows[rowIndex].DefaultCellStyle.BackColor = Color.White;
      this.rowIndexOfEditableRow = -1;
    }
}

上面的代码包含创建此演示所需的所有(设计器文件除外):

在此处输入图像描述

于 2013-07-14T12:49:48.277 回答