如何保持列只读状态;如果datagridview readonly状态在c#中发生变化

时间:2015-05-07 06:26:19

标签: c# winforms datagridview

我正在开发一个Windows窗体应用程序,我正在使用datagridview。它有一些列,其中ReadOnly为true,有些列为ReadOnly为false。

在某一点上,我必须阻止用户编辑datagridview,但仍然查看所有行,所以我将datagridview的ReadOnly属性设置为true。

当datagridview的readonly状态设置为false时,所有列的ReadOnly属性也设置为false。

我无法禁用datagridview,因为在禁用状态下,用户无法查看所有行。

提前致谢。

3 个答案:

答案 0 :(得分:1)

我最初的想法是让您为每个ReadOnly创建DataGridView列的列表。然后,您可以在ReadOnlyChanged事件中重置该列表中的每个DataGridView(代码副本太多),或将这些列表作为第二个参数发送到公共代码方法并在那里重置它们。但后来我想,如果你只能访问公共代码那会怎么样?

这使我得到以下通用解决方案。这个想法保持不变:每个DataGridView都会有一个ReadOnly列的列表。但是这个列表将通过DataGridView属性直接附加到Tag,而不是dgv(可能无法访问)父类中的代码膨胀。

如果您的公共代码方法如下所示:

public void DoStuff(DataGridView dgv)
{
    if (dgv.ReadOnly)
    {
        dgv.ReadOnly = false;
        // Do related stuff.
    }
    else
    {
        dgv.ReadOnly = true;
        // Do other related stuff.
    }

    // Do common stuff.
}

保存 / 加载 ReadOnly列进行以下更改:

public void DoStuff(DataGridView dgv)
{
    if (dgv.ReadOnly)
    {
        dgv.ReadOnly = false;

        // Load the saved ReadOnly columns.
        List<DataGridViewColumn> rocs = dgv.Tag as List<DataGridViewColumn>;

        if (rocs != null)
        {
            foreach (DataGridViewColumn roc in rocs)
            {
                roc.ReadOnly = true;
            }
        }

        // Do related stuff.
    }
    else
    {
        // Save the ReadOnly columns before the DGV ReadOnly changes.
        List<DataGridViewColumn> rocs = new List<DataGridViewColumn>();

        foreach (DataGridViewColumn col in dgv.Columns)
        {
            if (col.ReadOnly)
            {
                rocs.Add(col);
            }
        }

        dgv.Tag = rocs;
        dgv.ReadOnly = true;

        // Do other related stuff.
    }

    // Do common stuff.
}

答案 1 :(得分:0)

您只需设置Column.ReadOnly

即可恢复DataGridView.ReadOnly

您可以先将ReadOnly列保存到List中,然后使用循环

foreach(var column in dgv.Columns.Cast<DataGridViewColumn>().Where(i => !ReadOnlyColumnList.Contains(i)))
{
    column.ReadOnly = false;
}

答案 2 :(得分:0)

我使用了CellBeginEdit事件,并检查该列是否是我的任何只读列,然后取消该事件。

private void dataGridView_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
  //ReadOnly off/on enables this again - force non-editable
  if (e.ColumnIndex == 1 || e.ColumnIndex == 5) e.Cancel = true;
}