C#如何获取特定控件中的子控件
C# How to get child control in specific control
我需要从特定的子控件(GroupBox 中的 Picturebox)保存图像,参考这个 question,但是 GetAll() 是从最后到第一个 return 控件:ckBox8 -> ckBox3 -> ckBox1,如何将ckBox1的图像保存到ckBox8?
public IEnumerable<Control> GetAll(Control control, Type type)
{
var controls = control.Controls.Cast<Control>();
return controls.SelectMany(ctrl => GetAll(ctrl, type)).Concat(controls).Where(c => c.GetType() == type);
}
private void MyControlsTest()
{
var c = GetAll(this, typeof(CheckBox));
var ckBoxlist = c.OfType<CheckBox>().Where(ckBox => ckBox.Checked == true);
foreach (var i in ckBoxlist)
{
MessageBox.Show(i.Name);
/*Save PictureBox inside CheckBox if ckBox.Checked == true*/
}
}
因为你的控件有等同的名字,你可以转换你知道的控件的名字,找到你想要的控件:
foreach(var g in this.Controls.OfType<GroupBox>()){ //'this' is the Form. If all your GroupBoxes are in some other panel/container, use that panel's name instead
var cb = g.Controls[g.Name.Replace("gp", "ck")] as CheckBox;
var pb = g.Controls[g.Name.Replace("gpBox", "pb")] as PictureBox;
//PUT MORE CODE HERE e.g. if(cb.Checked) pb.Image.Save(...)
}
如果 cb/pb 是 null
,您需要查看层次结构以了解原因;我无法从屏幕截图中看出控件嵌套是什么样的。通过 [some name]
索引 ControlCollection 会带来作为集合的直接子成员的第一个控件,但请记住控件存在于树中 - 如果您在组框内有一个面板,则复选框是面板的子项,不是组框(面板是组框的子项)。
如果事物嵌套很深,您可以改为查看 ControlCollection.Find - 您可以指定一个布尔值,使其遍历所有子项。请注意,它 returns 一个控件数组
我需要从特定的子控件(GroupBox 中的 Picturebox)保存图像,参考这个 question,但是 GetAll() 是从最后到第一个 return 控件:ckBox8 -> ckBox3 -> ckBox1,如何将ckBox1的图像保存到ckBox8?
public IEnumerable<Control> GetAll(Control control, Type type)
{
var controls = control.Controls.Cast<Control>();
return controls.SelectMany(ctrl => GetAll(ctrl, type)).Concat(controls).Where(c => c.GetType() == type);
}
private void MyControlsTest()
{
var c = GetAll(this, typeof(CheckBox));
var ckBoxlist = c.OfType<CheckBox>().Where(ckBox => ckBox.Checked == true);
foreach (var i in ckBoxlist)
{
MessageBox.Show(i.Name);
/*Save PictureBox inside CheckBox if ckBox.Checked == true*/
}
}
因为你的控件有等同的名字,你可以转换你知道的控件的名字,找到你想要的控件:
foreach(var g in this.Controls.OfType<GroupBox>()){ //'this' is the Form. If all your GroupBoxes are in some other panel/container, use that panel's name instead
var cb = g.Controls[g.Name.Replace("gp", "ck")] as CheckBox;
var pb = g.Controls[g.Name.Replace("gpBox", "pb")] as PictureBox;
//PUT MORE CODE HERE e.g. if(cb.Checked) pb.Image.Save(...)
}
如果 cb/pb 是 null
,您需要查看层次结构以了解原因;我无法从屏幕截图中看出控件嵌套是什么样的。通过 [some name]
索引 ControlCollection 会带来作为集合的直接子成员的第一个控件,但请记住控件存在于树中 - 如果您在组框内有一个面板,则复选框是面板的子项,不是组框(面板是组框的子项)。
如果事物嵌套很深,您可以改为查看 ControlCollection.Find - 您可以指定一个布尔值,使其遍历所有子项。请注意,它 returns 一个控件数组