我正在继续研究一些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
但我不知道为什么不起作用。
答案 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