6

bool をチェックボックスに割り当てる方法を見つけようとしています。bool データが変更されたときに、checkbox.checked 値が自動的に更新されるようにします。ComboBox にはリストで作成する DataSource 属性があることは知っていますが、チェックボックスで同等のものを見つけることができません。

私は checkBox.DataBindings を試してみましたが、うまくいかないようです。一方、3 番目の属性の意味がよくわかりません。

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

同じチェックボックスの値を更新する 2 つの独立したウィンドウがあるため、これが必要です。

編集 :

イベントを使用してメイン GUI を更新しようとしましたが、「クロススレッド操作が無効です: コントロール 'checkBox' は、それが作成されたスレッド以外のスレッドからアクセスされました。

問題は、ブール値が、影響を受けるスレッド以外のスレッドから更新されるという事実へのリンクです。

4

2 に答える 2

4

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 オブジェクトのプロパティです。2 番目の属性はターゲット オブジェクトのインスタンスで、3 番目は最初の属性にバインドする必要があるターゲット オブジェクトのプロパティ名です。

毎秒 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();
}
于 2013-03-07T06:47:01.370 に答える
1

友達と一緒に問題を解決する簡単な方法を見つけます。フォームからDialogResultを使用します。フォームから戻ると、ボタンのクリックの状態がわかり、テキストボックスの値がわかります。私のチェックボックスの問題でも同じコードが機能します。

コードの例を次に示します。

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
{

    /// <summary>
    /// Value to be passed to the window.
    /// </summary>
    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;
    }
}
于 2013-03-07T19:46:02.780 に答える