我需要帮助我试图通过这种算法缩短长代码。
我在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()); }
错误消息:“集合已被修改;枚举操作可能无法执行。”
答案 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);
}
但对我而言,这种做法似乎很少 - 就像“黑客解决方法”一样,因为您需要检查集合values
和control 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
事件 - 控件将自动更新。