Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重构代码。。。控件。查找方法_C#_Winforms_Refactoring - Fatal编程技术网

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;