我有两种形式:表格A和表格B.我还有一个属性字段类。
表单A包含我想要在更改属性时更改的标签。表单B包含将更改属性字段的代码。
物业类代码:
public class Controller
{
private static string _customerID;
public static string customerID
{
get { return _customerID; }
set
{
_customerID = value;
if (_customerID != "")
{
FormA.ChangeMe();
}
}
}
}
表格B代码:
private void something_Click(object sender, SomethingEventArgs e) {
Controller.customerID = "Cool";
}
表格A代码:
public static void ChangeMe()
{
var frmA = new FormA();
MessageBox.Show("Test: " + Controller.customerID); //This works! Shows Cool
frmA.lb2Change.Text = Controller.customerID; //This kind of works..
MessageBox.Show("Test2: " + frmA.lb2Change.Text); //This shows the correct value. Shows Cool
}
传递属性字段值(我从MessageBox中知道)但是它不会更新表单标签本身的值。为什么是这样?我究竟做错了什么?我也相信有更好的替代方法可以实现预期实现的ChangeMe()方法 - 如果有任何建议的话?
答案 0 :(得分:1)
您可以执行以下操作
<强>代表强>
public delegate void OnCustomerIDChanging(object sender,CancelEventArgs e);
public delegate void OnCustomerIDChanged(object sender,object value);
public class Controller
{
private static string _customerID;
public event OnCustomerIDChanging CustoerIDChanging;
public event OnCustomerIDChanged CustoerIDChanged;
public static string customerID
{
get { return _customerID; }
set
{
// make sure that the value has a `value` and different from `_customerID`
if(!string.IsNullOrEmpty(value) && _customerID!=value)
{
if(CustomerIDChanging!=null)
{
var state = new CancelEventArgs();
// raise the event before changing and your code might reject the changes maybe due to violation of validation rule or something else
CustomerIDChanging(this,state);
// check if the code was not cancelled by the event from the from A
if(!state.Cancel)
{
// change the value and raise the event Changed
_customerID = value;
if(CustomerIDChanged!=null)
CustomerIDChanged(this,value);
}
}
}
}
}
}
在表单中以及启动控制器对象时
var controller = new Controller();
controller.CustomerIDChanging +=(sd,args) =>{
// here you can test if you want really to change the value or not
// in case you want to reject the changes you can apply
args.Cancel = true;
};
controller.CustomerIDChanged +=(sd,args) =>{
// here you implement the code **Changed already**
}
上面的代码可以让您很好地控制代码,也可以使您的控制器代码可重用和清理。相同 您可以通过实施
来获得结果INotifyPropertyChanged
接口
<强> INotifyPropertyChanged的强>
您可以查看此article以获取更多信息
答案 1 :(得分:0)
在静态方法ChangeMe
中,每次都要创建一个新表单,要更改值。而不是你想要改变现有表格的价值。因此,您的Controller需要此FormA
的实例。试试这样:
public class Controller
{
//You can pass the form throught the constructor,
//create it in constructor, ...
private FormA frmA;
private string _customerID;
public string customerID
{
get { return _customerID; }
set
{
_customerID = value;
if (_customerID != "")
{
frmA.ChangeMe();
}
}
}
}
现在您不需要在FormA
:
public void ChangeMe()
{
MessageBox.Show("Test: " + Controller.customerID);
this.lb2Change.Text = Controller.customerID;
}