寻找C#

时间:2017-07-12 05:36:24

标签: c# .net arrays algorithm complexity-theory

我需要帮助我试图通过这种算法缩短长代码。

我在TextBox字段

上使用它
Textbox[] Fields = new Textbox[] { txtbox1, txtbox2, txtbox3.. };
string[] arr = { stringVariable1, stringVariable2, stringVariable3.. };

int cnt = 0;
foreach(var r in Fields.AsEnumerable())
{
    r.Text = arr[cnt].toString();
    cnt++;
}

因此,当表单加载时,如果变量为空或具有值,则将根据变量填充用户输入字段。

但是,如果我有不同类型的字段?比如datepicker值,组合框和文本框,单选按钮和复选框字段。

object[] fields = new object[] { datepicker1, Txtbox1, ComboBox1, CheckBox1 };

将它与我用不同类型的对象声明的数组匹配

object[] arr = { DateVar1, TxtBoxVarString1, ComboBoxstring1, CboxBool1, int.. }

是否可以声明这样的事情,这样我可以缩短我的代码,或者我必须手动执行,因为它是不可能的。

我试过这段代码:

ArrayList arrvar = new ArrayList(); object[] obj = new object[] { datevarvalue1, cboxvarbool1, rbtnvarbool1, stringvar1.. etc.. etc.. }

arrvar.addrange(obj); try { List Fields = new List { AddinfoDOB.Value, CheckBox1.Checked, RadioButton1.Checked, AddinfoPlaceOfBirth.Text, AddInfoCmbBoxBloodT.Text, AddInfoCmbBoxOrigin.Text, AddInfoCmbBoxCitizenship.Text, AddInfoCmbBoxLanguage.Text, AddInfoAddress01.Text };

                int cnt = 0;
                foreach (object r in Fields.AsEnumerable())
                {
                    Fields[cnt] = arrvar[cnt];
                    cnt++;
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); }

错误消息:“集合已被修改;枚举操作可能无法执行。”

2 个答案:

答案 0 :(得分:1)

实际上你可以声明那种数组。我只是测试它,它的工作原理。试试这个例子:

添加一个按钮和一个复选框。

using System.Windows.Forms;

string temp = "Hi!";

Object[] arr = new Object[] { button1, checkBox1, temp };

foreach(Object a in arr)
{
    if (a is button)
        MessageBox.Show(((Button)a).Name);
    else if (a is CheckBox)
        MessageBox.Show(((CheckBox)a).Name);
    else if (a is String)
        MessageBox.Show(((String)a));
}

答案 1 :(得分:1)

您可以通过引入“更新”功能的集合来实现 创建更新函数集合和相应的值集合

var updateFunctions = new List<Action<object>>
{
    value => textbox.Text = (string)value,
    value => datepicker.Value = (DateTime)value,
    value => checkbox.Checked = (bool)value,
};

var values = new List<object>
{
    "TextBox value",
    DateTime.Now,
    true,
};

for(var index = 0; i < updateFunctions.Count; i++)
{
    var update = updateFunctions[i];
    var value = values[i];
    update(value);
} 

但对我而言,这种做法似乎很少 - 就像“黑客解决方法”一样,因为您需要检查集合valuescontrol updates是否应该处于“同步”状态。
使用少量出价清算方式进行数据绑定可以实现同样的目的

为要在控件中显示的值创建一个类

public class DisplayData
{
    public string Name {get; set; }
    public DateTime Birthdate {get; set; }
    public bool IsActive {get; set; }
}

然后在表单构造函数中“绑定”控件到数据

public YourForm() // Form constructor
{
    InitializeComponents();

    var data = new DisplayData
    {
        Name = "name",
        Birthdate = DateTime.Now,
        IsActive = true
    };

    textbox.DataBindings.Add("Text", data, "Name");
    dateTimePicker.DataBindings.Add("Value", data, "Birthdate");
    checkBox.DataBindings.Add("Checked", data, "IsActive");
}

更改控制值时,data实例中的对应值也会更改。

如果您使DisplayData类实现了INotifyPropertyChanged接口,并且每次更改PropertyChanged实例中的值时都会引发data事件 - 控件将自动更新。