我正在尝试监控一个值,当它被更改时,在对结果执行某些计算后更新文本字段。
我想要监控的值来自aaa
bbb
属性(自定义控件)。我希望在aaa
bbb
bbb
bbb
更改时更新文本字段。
我已经查看过诸如This One之类的问题,但我真的不明白这是如何工作的,或者我需要改变以获得我正在寻找的结果。
任何人都可以更好地解释我需要做什么才能使其发挥作用吗?
AGauge
是AGauge.Value
类型,让您疑惑。
提前致谢。
更新1
我现在已将以下代码添加到我的项目中:
AGuage.Value
并且可以使用以下内容触发float
:
public class AGuage
{
private float _value;
public float Value
{
get
{
return this._value;
}
set
{
this._value = value;
this.ValueChanged(this._value);
}
}
public void ValueChanged(float newValue)
{
}
}
每次ValueChanged
更新时都会触发。
我现在面临的问题或最后一个障碍是这一部分:
AGuage n = new AGuage();
n.Value = Pressure_Gauge.Value;
我想使用上述方法更新Pressure_Gauge.Value
上的标签文字,但我收到错误消息:public void ValueChanged(float newValue)
{
Form1.Pressure_Raw.text = "Working";
}
。
我不知道如何做到这一点,我已经阅读了一些有关静态属性的信息,但是如何更新标签的文本值?
感谢。
答案 0 :(得分:4)
This可能有所帮助。您可以添加一个事件并在表单中订阅它。
例如:
public class AGauge {
// You can either set the Value this way
public float Value {
get {return this.Value;}
set
{
// (1)
// set "Value"
this.Value = value;
// raise event for value changed
OnValueChanged(null);
}
}
// create an event for the value change
// this is extra classy, as you can edit the event right
// from the property window for the control in visual studio
[Category("Action")]
[Description("Fires when the value is changed")]
public event EventHandler ValueChanged;
protected virtual void OnValueChanged(EventArgs e)
{
// (2)
// Raise the event
if (ValueChanged != null)
ValueChanged(this,e);
}
}
public Form1 : Form {
// In form, make your control and add subscriber to event
AGauge ag = new AGauge();
// (3)
ag.ValueChanged += UpdateTextBox;
// (4)
public void UpdateTextBox(object sender, EventArgs e)
{
// update the textbox here
textbox.Text = ag.Value;
}
}
以下是如何运作的: 在(3),您按照HERE所述向ag.ValueChanged事件添加订阅者。 当你去改变ag.Value时,你会到(1),其中Value被改变并且OnValueChanged被调用。这会将您带到(2),其中会引发ValueChanged事件。发生这种情况时,该事件的所有订阅者都会被通知"并称他们各自的方法。因此,当你到达(2)时,(4)最终会被调用,因为" UpdateTextBox"被设置为ValueChanged事件的订阅者。这有点棘手,但它非常有用。
或者如果您想继续尝试这样做,您需要这样做:
public class AGuage
{
private float _value;
// create object of Form1 for reference
private Form1 form1;
// pass reference to form1 through constructor
public AGauge(Form1 form1)
{
// assign
this.form1 = form1;
}
public float Value
{
get
{
return this._value;
}
set
{
this._value = value;
this.ValueChanged(this._value);
}
}
public void ValueChanged(float newValue)
{
// use the form1 reference
this.form1.Pressure_Raw.Text = "Working";
}
}
然后这样做:
// if creating the AGauge object in Form1, pass "this" to the object
AGuage n = new AGuage(this);
我强烈建议你不要这样做,因为这打破了OOP的泛型规则。这意味着,如果您尝试在Form1之外的任何其他位置使用此AGauge控件,它将无法以相同的方式工作。我建议用我上面描述的事件来做。它更具普遍性。
答案 1 :(得分:1)
您需要制作AGauge
工具INotifyPropertyChanged
,并通知Value
更改房产。 Google上有关于如何执行此操作的足够信息,并已在StackOverflow中进行了数百次讨论。
然后,您需要使用Binding
将文本框绑定到AGauge
值。由于您需要转换,因此您需要提供格式化和可选的解析。
这应该是这样的:
var binding = new Binding("Text", myAgaugeControl, "Value");
binding.Format += BindingFormat;
binding.Parse += BindingParse;
myTextBox.DataBindings.Add(binding);
BindingFormat
和BindingParse
应该是转换器。 Format
用于将规格值转换为文本框字符串。最简单的:
void BindingFormat(object sender, ConvertEventArgs e)
{
e.Value = e.Value.ToString();
}
BindingParse
则相反:如果文本框文本发生更改,则需要解析文本并将其转换为值AGauge
可以理解的值。我会让你弄清楚这一点。
答案 2 :(得分:1)
您需要做的是为Value属性创建自定义setter。每次设置值时,您的代码都会调用我称为ValueChanged()的钩子方法。在该方法中,您可以执行计算,然后将文本字段设置为结果。
public class AGuage
{
private float _value;
public float Value
{
get
{
return this._value;
}
set
{
this._value = value;
this.ValueChanged(this._value);
}
}
public void ValueChanged(float newValue)
{
// Action to perform on value change
// Update a text field after performing some calculations with a result.
}
}
答案 3 :(得分:0)
一个不错的选择是使用Microsoft的Reactive Framework(NuGet" Rx-WinForms")。它允许你以类似LINQ的方式使用observables(而不是enumerables)。
你的课程看起来像这样:
public class AGuage
{
private float _value;
private Subject<float> _values = new Subject<float>();
public float Value
{
get { return _value; }
set
{
_value = value;
_values.OnNext(value);
}
}
public IObservable<float> Values
{
get { return _values.AsObservable(); }
}
}
现在你可以这样做:
var aGuage = new AGuage();
var query =
from value in aGuage.Values
where value > 5.0f && value < 20.0f //filtering
select value * 150f + 45.3f; //computation
var subscription =
query.Subscribe(value =>
{
/* do something with the filtered & computed value */
});
aGuage.Value = 2.1f; // query.Subscribe doesn't fire
aGuage.Value = 12.4f; // query.Subscribe DOES fire
aGuage.Value = 202.1f; // query.Subscribe doesn't fire
如果您想关闭对这些值的订阅,请拨打subscription.Dispose()
。