Collection * OF * DataGridViews?一次操作所有DataGridViews

时间:2013-07-01 14:42:31

标签: c# vb.net datagridview

我正在继续研究一些VSTO,我想知道是否有一种方法可以同时引用一个类中的所有datagridviews。我似乎无法弄清楚容器应该是什么,我似乎无法将它们添加到数组/其他容器中?

我正在做的psudo代码将是:

For Each datagridview in Globals.MyUserControl
   'change some datagridview property ie:
   datagridview1.ReadOnly = True
Next

我会在C#或VB.net中熟悉,或者是否可以或不可以做任何解释。目前我正在手动为所有不同的数据网格设置它,随着这个数字的增长,我想要一种方法同时点击它们。

仍在尝试使用下面的解决方案,我试过这种方法的另一种方法不起作用:

    For Each ctl In Me.Controls
        If TypeOf ctl Is DataGridView Then
            ctl.ReadOnly = True
            ctl.AllowUserToDeleteRows = False
        End If
    Next

但我不知道为什么不起作用。

3 个答案:

答案 0 :(得分:4)

您可以使用foreach循环:

foreach (DataGridView ctrl in Globals.MyUserControl.Controls)
    ctrl.ReadOnly = true;

如果你期望控件集合中的任何非datagridview控件你不想设置为只读,那么你可以检查ctrl的类型而不是单个语句。

foreach (Control ctrl in Globals.MyUserControl.Controls)
    if(ctrl is DataGridView) ctrl.ReadOnly = true;

使用LINQ,您可以这样做:

Globals.MyUserControl.Controls.Cast<Control>().ToList().ForEach((ctrl) => { if (ctrl is DataGridView) ((DataGridView)ctrl).ReadOnly = true; });

或者,如果已知所有控件都是DataGridView控件,则可以执行以下操作:

Globals.MyUserControl.Controls.Cast<DataGridView>().ToList().ForEach(ctrl => ctrl.ReadOnly = true);

要在其他控件中查找子控件,请定义递归方法并调用:

    private static void FindControlsRecursively(Control.ControlCollection collection)
    {
        foreach (Control ctrl in collection)
        {
            if (ctrl is DataGridView)
                ((Label)ctrl).ReadOnly = true;
            else if (ctrl.Controls.Count > 0)
                FindControlsRecursively(ctrl.Controls);
        }
    }

然后使用用户控件中的用户控件控件调用它:

FindControlsRecursively(this.Controls);

答案 1 :(得分:1)

这样的事情应该有效:

    For Each ctl In Me.Controls.OfType(Of DataGridView)()
        ctl.ReadOnly = True
        ctl.AllowUserToDeleteRows = False
    Next

或C#

        foreach (DataGridView ctrl in this.Controls.OfType<DataGridView>())
        {
            ctrl.ReadOnly = true;
            ctrl.AllowUserToDeleteRows = false;
        }

这只遍历表单中的DataGridViews。

此外,如有必要,您可以将它们添加到List(Of DataGridView)

另一种选择是声明一个继承DataGridView的类,设置所需的属性,并声明此类型的新datagridviews以添加到表单中。

答案 2 :(得分:0)

我不确定我是否应该把它放在答案中,或者如果Tombola想把它移到他的身上,但这是我的解决方案。问题是我的所有datagridviews都嵌套在选项卡控件的选项卡页面上。为了让它工作,我使用了:

    For Each tabpg In TabControl1.TabPages()
        For Each ctl In tabpg.Controls  'note, was not able to use 'OfType here, but had to drop to the If statement or I ran into runtime errors.
            If TypeOf ctl Is DataGridView Then
                ctl.ReadOnly = True
                ctl.AllowUserToDeleteRows = False
            End If
        Next
    Next