使用DataBindings
在控件之间切换时,C#WinForms中的tab
出现问题。我创建了一个示例WinForms应用程序来显示此问题。这是代码:
PersonModel person { get; set; } = new PersonModel();
private void frmMain_Load(object sender, EventArgs e)
{
//Create test person, populate with values
person = new PersonModel { FirstName = "Sammy", LastName = "Smith", UserType = "Admin", Age = 29, Gender = "Female", EducationYears = 4};
CreateBindings();
}
private void CreateBindings()
{
txtFirstName.DataBindings.Add("Text", person, "FirstName");
txtLastName.DataBindings.Add("Text", person, "LastName");
cmbUserType.DataBindings.Add("Text", person, "UserType", false, DataSourceUpdateMode.OnPropertyChanged);
cmbGender.DataBindings.Add("Text", person, "Gender", false, DataSourceUpdateMode.OnPropertyChanged);
nudAge.DataBindings.Add("Value", person, "Age", true, DataSourceUpdateMode.OnPropertyChanged);
nudEducationYears.DataBindings.Add("Value", person, "EducationYears", true, DataSourceUpdateMode.OnPropertyChanged);
}
private void btnSave_Click(object sender, EventArgs e)
{
MessageBox.Show(person.ToString());
}
class PersonModel
{
public string FirstName { get; set; } = "";
public string LastName { get; set; } = "";
public string UserType { get; set; } = "Read-only";
public string Gender { get; set; } = "Unspecified";
public int Age { get; set; } = 0;
public int EducationYears { get; set; } = 0;
public override string ToString()
{
string message = "";
message += $"First name: {this.FirstName}{Environment.NewLine}";
message += $"Last name: {this.LastName}{Environment.NewLine}";
message += $"User type: {this.UserType}{Environment.NewLine}";
message += $"Gender: {this.Gender}{Environment.NewLine}";
message += $"Age: {this.Age.ToString()}{Environment.NewLine}";
message +=$"Education (years): {this.EducationYears.ToString()}";
return message;
}
}
UI只是绑定到PersonModel
person
的几个TextBoxes,ComboBoxes和NumericUpDown控件。当我用鼠标单击UI并更改控件中的值时,程序将按预期工作:当我单击Save
时,ToString()
的{{1}}方法显示所有属性已按预期更新。但是,当我重新启动应用程序并通过控件使用Tab键时,组合框的数据绑定(对于PersonModel
和Gender
)不会更新User Type
中的值。当我跳至person
并按下Save
时,Enter
方法显示ToString()
中的Gender
和UserType
属性没有改变。 / p>
在单击UI时,所有输入值均正确反映在person
中:
在用户界面中切换时,person
和Gender
的输入值不会应用于各自的属性(请注意,UserType
和Admin
的默认值保持不变):
这是什么问题?为什么在单击UI时数据绑定能按预期工作,但是在通过Tab键浏览时却不能按预期工作?我是否需要为数据绑定中的组合框选择其他Female
?如果PropertyName
不是在数据绑定中使用的正确权限Text
,为什么在单击控件时PropertyName
可以正常工作?
编辑:来自LarsTech的评论解决了我的问题,但是对于其他社区,我仍然想听听有关为什么使用Text
导航我的表单时不更新数据绑定的任何想法。形式呢。我知道focus events differ when when using tab as opposed to clicking。但是,由于仍然触发所有相同的事件,所以我不知道这是否可以解释差异。
答案 0 :(得分:0)
正如LarsTech在评论中提到的那样,将DataBinding
Property
从Text
更改为SelectedItem
会使表格按预期方式工作。使用tab
浏览表单时,DataBinding
会更新绑定属性,就像我单击表单一样。
我仍然不知道为什么在绑定属性为tab
时使用person
浏览表单不会更新Text
对象,尤其是在单击表单时导致绑定以按预期更新。如原始问题所述,我仍然很好奇为什么行为如此不同。如果有人有任何见识,我很想知道为什么会这样。