Csharp/C#教程:bool作为CheckBox的数据源(Bool更新在另一个线程中而不是它正在影响的线程)分享


bool作为CheckBox的数据源(Bool更新在另一个线程中而不是它正在影响的线程)

我试图找到如何将bool分配给复选框。 我希望当我的bool数据发生变化时,我的checkbox.checked值会自动刷新。 我知道对于ComboBox,有一个DataSource属性,它使用一个列表,但我无法找到与复选框等效的。

我尝试使用checkBox.DataBindings,但它似乎不起作用。另一方面,我真的不知道第三个属性是什么意思。

checkBox.DataBindings.Add("Checked", DisableBugWatcher, "check"); 

我需要这个,因为我有两个独立的窗口刷新相同的复选框值!

编辑:

我尝试使用Event更新我的主GUI,但它说: 跨线程操作无效:控制’checkBox’从一个线程访问,而不是创建它的线程。

问题是这样一个事实,即bool值是从另一个线程刷新而不是它影响的线程。

要使DataBindings工作,您必须在包含bool值的类中实现INotifyPropertyChange 。 如果从UI线程以外的线程中访问myValue,则必须使用SynchronizationContext并在UI线程中初始化myObject。

 public class myObject : INotifyPropertyChanged { // The class has to be initialized from the UI thread public SynchronizationContext context = SynchronizationContext.Current; bool _myValue; public bool myValue { get { return _myValue; } set { _myValue = value; // if (PropertyChanged != null) // PropertyChanged(this, new PropertyChangedEventArgs("myValue")); if (PropertyChanged != null) { context.Send( new SendOrPostCallback(o => PropertyChanged(this, new PropertyChangedEventArgs("myValue")) ), null); } } } public event PropertyChangedEventHandler PropertyChanged; } 

然后,将DataBinding设置为:

 checkBox1.DataBindings.Add("Checked", myObject.GlobalObject, "myValue"); 

第一个参数是要绑定到的UI对象的属性。 第二个属性是您的目标对象实例,第三个属性是需要绑定到第一个的目标对象的属性名称。

我尽力使用每秒切换myValue的计时器来反映您的场景(相应地选中复选框)。 这是我使用的表单的代码:

 System.Timers.Timer x = new System.Timers.Timer(); myObject target; public Form1() { InitializeComponent(); target = new myObject(); x.Elapsed += (s, e) => { target.myValue = !target.myValue; }; x.Interval = 1000; checkBox1.DataBindings.Add("Checked", target, "myValue"); x.Start(); } 

我找到一个更容易的方式与朋友解决我的问题。 我使用我的表单中的DialogResult。当我从表单返回时,它给我按钮单击的状态,它给了我文本框的值。 相同的代码适用于我的复选框问题。

以下是代码的示例:

上述就是C#学习教程:bool作为CheckBox的数据源(Bool更新在另一个线程中而不是它正在影响的线程)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 public partial class MainWindow : Form { private OtherWindow m_otherWindow; public MainWindow() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // Lazy create other window if it doesn't exist. m_otherWindow = m_otherWindow ?? new OtherWindow(); // Passe textbox value to other window. m_otherWindow.PassedValue=textBox1.Text; if (m_otherWindow.ShowDialog()==DialogResult.OK) { // Clicked ok : update textbox value with textbox value of other window. textBox1.Text=m_otherWindow.PassedValue; } } private void button2_Click(object sender, EventArgs e) { Close(); } } public partial class OtherWindow : Form { ///  /// Value to be passed to the window. ///  public string PassedValue { get { return textBox1.Text; } set { textBox1.Text = value; } } public OtherWindow() { InitializeComponent(); } private void button2_Click(object sender, EventArgs e) { DialogResult = DialogResult.OK; } } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1013622.html

(0)
上一篇 2021年12月30日
下一篇 2021年12月30日

精彩推荐