C# 重构代码。。。控件。查找方法
好的,我有一个代码(见下文):C# 重构代码。。。控件。查找方法,c#,winforms,refactoring,C#,Winforms,Refactoring,好的,我有一个代码(见下文): void M1() { 对于(int i=1;i0)) { 复选框enableCB=carr[0]作为复选框; enableCB.Checked=i%2==0?true:false;//或任何其他值 } } } 我不喜欢使用控件的迭代。Find方法。我能换成更简单的吗 注:所有数字xcheckbox(X>=0和X如果您使用3.5或以其他方式使用LINQ,您可以执行以下操作 for ( int i = 0; i < 9; i++) { var contr
void M1()
{
对于(int i=1;i<10;i++)
{
Control[]carr=this.Controls.Find(“编号”+
(i-1).ToString()+
“复选框”,正确);
如果((carr!=null)和(&(carr.Length>0))
{
复选框enableCB=carr[0]作为复选框;
enableCB.Checked=i%2==0?true:false;//或任何其他值
}
}
}
我不喜欢使用控件的迭代。Find方法。我能换成更简单的吗
注:所有数字xcheckbox(X>=0和X如果您使用3.5或以其他方式使用LINQ,您可以执行以下操作
for ( int i = 0; i < 9; i++) {
var control = this.Controls
.Find(String.Format("Number{0}Checkbox", i))
.Cast<CheckBox>()
.FirstOrDefault();
if ( control != null ) {
control.Checked = (i % 2) != 0;
}
}
for(int i=0;i<9;i++){
var control=this.Controls
.Find(String.Format(“Number{0}复选框”,i))
.Cast()
.FirstOrDefault();
if(控件!=null){
控件。选中=(i%2)!=0;
}
}
更多linq-y
for (int i = 0; i < 10; i++) {
var c = (from CheckBox c in this.Controls.Find(String.Format(CultureInfo.InvariantCulture, "Number{0}CheckBox", i-1), true)
select c).FirstOrDefault();
if (c != null) {
c.Checked = i % 2 == 0 ? true : false;
}
}
for(int i=0;i<10;i++){
var c=(来自此.Controls.Find(String.Format(CultureInfo.InvariantCulture,“数字{0}复选框”,i-1)中的复选框c,true)
选择c).FirstOrDefault();
如果(c!=null){
c、 选中=i%2==0?真:假;
}
}
我建议您在类型中引入一个字段,以保留对复选框的引用(数组、列表、字典,由您选择)。这样,您就不再需要使用这种非类型的、有点难看的按键查找控件了
无论如何,如果您仍在.NET 2.0中,并且更喜欢使用Find
方法,则可以简化一点循环:
for (var i = 0; i <= 8; i++)
{
var controls = Controls.Find("Number" + i + "CheckBox", true);
if (controls.Length > 0)
{
var checkBox = controls[0] as CheckBox;
if (checkBox != null)
checkBox.Checked = i%2 == 0;
}
}
for(变量i=0;i 0)
{
var checkBox=控制[0]作为复选框;
如果(复选框!=null)
checkBox.Checked=i%2==0;
}
}
在
复选框上最新的非空性测试可能可以忽略。这里有一个没有linq的测试,但是稍微清理了代码
for (int i = 1; i < 10; i++)
{
Control[] carr = this.Controls.Find("Number" + (i - 1) + "CheckBox", true);
if (carr.Length <= 0) continue;
CheckBox enableCB = carr[0] as CheckBox;
enableCB.Checked = (i % 2) == 0;
}
}您可以将您的复选框
控件包装在一个容器中,而不是按名称进行搜索,这意味着您可以在容器中的控件之间进行迭代吗?您可以使用LINQ吗?这是Winform/.NET2.0应用程序吗?重新考虑一下这个设计怎么样?即使是一个将int映射到复选框的字典也比这个好。它是不是我的代码。我的经理2天前给我的。它包含大约40个windows窗体。在几乎所有的windows窗体中,我都看到了这种构造。我想让它更简单=>所以我问了这个问题。也许我会使用字典…我在想..这里唯一明智的答案。使用LINQ不会把一个糟糕的设计变成一个好的设计。这很复杂,因为我在这个循环中,我使用其他NumberXTextBox、NumberXCheckBox1、NumberXCheckBox2控件等等..所有复选框都位于表单的不同容器中,因此我不能将它们仅分组在一个分组框中…创建表单时,您能用代码创建集合吗?如果“carr”,它不会引发异常吗==null?不,因为MSDN文档中没有提到它。如果你查看Find()的实现,你会发现它在内部实例化了Control[]array=new Control[list.Count];如果Count为零,那么它返回一个空数组。(如果我对此投了反对票,有人需要打屁股)
for (int i = 1; i < 10; i++)
{
Control[] carr = this.Controls.Find("Number" + (i - 1) + "CheckBox", true);
if (carr.Length <= 0) continue;
CheckBox enableCB = carr[0] as CheckBox;
enableCB.Checked = (i % 2) == 0;
}
public Control[] Find(string key, bool searchAllChildren)
{
if (string.IsNullOrEmpty(key))
{
throw new ArgumentNullException("key", SR.GetString("FindKeyMayNotBeEmptyOrNull"));
}
// Will always return an ArrayList with zero or more elements
ArrayList list = this.FindInternal(key, searchAllChildren, this, new ArrayList());
// Will always return an Array of zero or more elements
Control[] array = new Control[list.Count];
list.CopyTo(array, 0);
return array;