无法使用数据绑定的DataGridView设置Row.Readonly = false

时间:2019-02-06 16:07:38

标签: c# datagridview

我有一个绑定到dataGridView的{​​{1}},该表后面是一个MS SQL Server数据库。

tableAdaptor中,我有Form1_Load;在dataGridView1.ReadOnly = true;控件中,我已选择dataGridView1

![Showing the controls set

然后我在运行时在此处填充Enable EditingdataGridView

我要执行的操作是让用户选择一行中的任何单元格,然后单击一个按钮,然后允许用户编辑该行。

我尝试了各种方法来获取用户当前已选择设置为stockTableAdapter.Fill(sIMSDataSet.Stock);的行,但是我无法使其正常工作。

这是我尝试过的:

ReadOnly=flase

我也尝试过答案是这个问题:

unable to set Row.Readonly=false in Datagridview in winforms

用户在测试中建议他无法将数据绑定 private void button7_Click_1(object sender, EventArgs e) { if (dataGridView1.CurrentRow.ReadOnly == true) { dataGridView1.CurrentRow.ReadOnly = false; dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter; } } 上的行设置为ReadOnly=flase。但是看到答案已经6岁了,我希望现在有办法。

1 个答案:

答案 0 :(得分:1)

从某种意义上说,您尚不清楚这个问题,因为目前尚不清楚网格的最初设置方式。看与上一个问题的链接,我不确定“为什么”数据绑定网格会有所作为。从总体上看,使各个行只读是很奇怪的。换句话说,如果仅在加载表单时读取网格,则无论数据源如何,所有行都是只读的。

因此,我猜想不是将“单个”行设置为只读,而是简单地将“整个”网格设置为只读“可能”。如果您像链接一样连接网格RowLeave事件,这将起作用。

例如,整个网格是只读的,用户无法更改单元格,然后用户单击其中一行中的“编辑”按钮。发生这种情况时,我们为单击“编辑”按钮所在的行设置行颜色,以直观地向用户显示该行已准备好进行编辑。然后将网格只读属性设置为false。显然,这将允许用户此时“编辑”网格中的任何单元格,但是,如果我们将网格的只读属性设置为true,则连接网格RowLeave事件将防止这种情况。 / p>

用于此操作的代码相对简单...注意:InEditMode1变量用于知道是否正在编辑一行,并避免在当前无行时重新设置网格只读属性。正在编辑。

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {
  if (dataGridView1.Columns[e.ColumnIndex].Name == "Edit") {
    dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.GreenYellow;
    dataGridView1.ReadOnly = false;
    InEditMode1 = true;
  }
}

private void dataGridView1_RowLeave(object sender, DataGridViewCellEventArgs e) {
  if (InEditMode1) {
    dataGridView1.ReadOnly = true;
    dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
    InEditMode1 = false;
  }
}

将网格拖放到新表单上并使用下面的代码添加列和一些数据应该可以对此进行测试。

public void CreateDataGridView() {
  dataGridView1.Columns.Add("Id", "Id");
  dataGridView1.Columns.Add("Lastname", "Lastname");
  dataGridView1.Columns.Add("City", "City");
  dataGridView1.Columns.Add(GetBtnColumn());
  dataGridView1.Rows.Add("1", "Muller", "Seattle");
  dataGridView1.Rows.Add("2", "Arkan", "Austin");
  dataGridView1.Rows.Add( "3", "Cooper", "New York");
}

接下来是对网格使用DataSource的示例。在此示例中,DataTable用作网格的DataSource。此外,在设置了网格Button之后,将添加“编辑” DataSource列。表单加载事件可能如下所示……

private void Form2_Load(object sender, EventArgs e) {
  DataTable GridTable = GetDataTable();
  FillDataTable(GridTable);
  dataGridView2.DataSource = GridTable;
  dataGridView2.Columns.Add(GetBtnColumn());
}

用于测试...

public DataTable GetDataTable() {
  DataTable dt = new DataTable();
  dt.Columns.Add("Id", typeof(string));
  dt.Columns.Add("LastName", typeof(string));
  dt.Columns.Add("City", typeof(string));
  return dt;
}

private void FillDataTable(DataTable dt) {
  dt.Rows.Add("1", "Muller", "Seattle");
  dt.Rows.Add("2", "Arkan", "Austin");
  dt.Rows.Add("3", "Cooper", "New York");
}

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

请注意,此代码与上面的NON-DataBound网格中的代码相同。

private void dataGridView2_CellClick(object sender, DataGridViewCellEventArgs e) {
  if (dataGridView2.Columns[e.ColumnIndex].Name == "Edit") {
    dataGridView2.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.GreenYellow;
    dataGridView2.ReadOnly = false;
    InEditMode2 = true;
  }
}

private void dataGridView2_RowLeave(object sender, DataGridViewCellEventArgs e) {
  if (InEditMode2) {
    dataGridView2.ReadOnly = true;
    dataGridView2.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
    InEditMode2 = false;
  }
}

我希望这会有所帮助。