关于winforms:如何保持列只读状态; 如果datagridview只读状态在c#中更改

How to retain column readonly state; if datagridview readonly state changes in c#

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

在某个时候,我必须阻止用户编辑datagridview,但是仍然查看所有行,因此我将datagridview的ReadOnly属性设置为true。

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

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

提前致谢。


我最初的想法是让您为每个DataGridView创建一个ReadOnly列的列表。 然后,让您从该列表中重置那些列,或者在每个DataGridViewReadOnlyChanged事件中(代码副本过多),或者将这些列表作为第二个参数发送给通用代码方法,然后在此处进行重置。 但是后来我想,如果您只能访问通用代码怎么办?

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

如果您的通用代码方法如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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列:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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.
}

您不能仅通过设置DataGridView.ReadOnly来还原Column.ReadOnly状态

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

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