【问题标题】:Unable to set Row.Readonly=false with databound DataGridView无法使用数据绑定 DataGridView 设置 Row.Readonly=false
【发布时间】:2019-02-06 16:07:37
【问题描述】:

我有一个绑定到tableAdaptordataGridView,这个表后面是一个MS SQL 服务器数据库。

Form1_Load 中,我有dataGridView1.ReadOnly = true;,在dataGridView1 控件中,我选择了Enable Editing

然后我在运行时在这里填写dataGridViewstockTableAdapter.Fill(sIMSDataSet.Stock);

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

我尝试了各种方法来将用户当前选择的行设置为ReadOnly=flase,但我无法让它工作。

这是我尝试过的:

  private void button7_Click_1(object sender, EventArgs e)
        {
            if (dataGridView1.CurrentRow.ReadOnly == true)
            {
                dataGridView1.CurrentRow.ReadOnly = false;
                dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;
            }
        }

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

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

用户在他的测试中建议他无法将数据绑定dataGridViews 上的行设置为ReadOnly=flase。但是看到答案现在已经 6 岁了,我希望现在有办法做到这一点。

【问题讨论】:

    标签: c# datagridview


    【解决方案1】:

    从某种意义上说,您的问题有些令人困惑,因为尚不清楚最初是如何设置网格的。查看上一个问题的链接,我不确定“为什么”数据绑定网格会有所作为。从整体角度来看,将各个行设为只读似乎很奇怪。换句话说,如果表格加载时表格是只读的,那么无论数据源如何,所有行都是只读的。

    因此,与其将“单个”行设置为只读,我猜“可能”简单地将“整个”网格设置为只读更容易。如果您像链接那样连接网格RowLeave 事件,这将起作用。

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

    此代码相对简单...注意: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;
      }
    }
    

    我希望这会有所帮助。

    【讨论】:

    • 完美!我没有使用您的确切答案,但我使用了将 enire 网格设置为 readonly=false 的前提。然后在单元离开时设置 readonly=true。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 2012-03-13
    相关资源
    最近更新 更多