0

Silverlight の子ウィンドウでチェックボックスを使用しています。

ユーザーがチェックボックスをクリックすると、トグル関数がデータベースに送信されます。チェックボックスがオンの場合、値 = 1、チェックされていない値 = -1 であるため、トグルはこれらの値を変更します。

次のコードを使用して-

private int checkCounter1 = 0;

private void checkBox1_Checked(object sender, RoutedEventArgs e)
{
    if (checkCounter1 == 0)
    {
    }
    else
    {
        //Web Service toggle function 
    }

    checkCounter1 = 1;
}

private void checkBox1_Unchecked(object sender, RoutedEventArgs e)
{
    if (checkCounter1 == 0)
    {
    }
    else
    {
        //Web Service toggle function
    }

    checkCounter1 = 1;
}

ユーザーがチェックボックスをクリックすると、期待どおりに Web サービス呼び出しが呼び出され、値が切り替えられます。

私の問題は、子ウィンドウがロードされると、これが何らかの理由で で Web サービス呼び出しを呼び出していることcheckBox1_Checkedです。何故かはわからない。したがって、を追加することで、checkCounterこれがページの読み込み時にトグル機能をスキップすることを望んでいました.

ページの読み込み時に、別の Web サービス呼び出しを使用して現在チェックボックスの値を呼び出しています。データベースで値が = から 1 の場合は、フォームでチェックボックスをオンにする必要があります。

void Settings_Loaded(object sender, RoutedEventArgs e)
{
    cosainWebService.Service1SoapClient();
    client.callFlagsCompleted += new EventHandler<callFlagsCompletedEventArgs>(client_callFlagsCompleted);
    client.callFlagsAsync();
}

次に、callFlags の結果を取得して、ここで使用します。

void client_callFlagsCompleted(object sender, callFlagsCompletedEventArgs e)
{            
    string flag = System.Convert.ToString(e.Result);

    foreach (string x in e.Result)
    {
        string[] array = x.Split(',');

        if (array[1] == "Checkbox Name" ) 
        {
            if (array[0] == "1") //this is the value in the database
            {
                checkBox1.IsChecked = true;
            }
            else
            {

            }
        }
    }
}

チェックボックス XAML は次のようになります。

<CheckBox Content="CheckBox Name" Height="16" HorizontalAlignment="Left" Margin="12,42,0,0" Name="checkBox1" VerticalAlignment="Top" Checked="checkBox1_Checked" Unchecked="checkBox1_Unchecked"/>

したがって、デバッグ時にチェックボックスをクリックすると、データベースの値がトグルされるため、ユーザーがボックスをチェックすると、値が「1」として保存され、ウィンドウを閉じて再度ロードし、ボックスにチェックを入れる必要がありますが、何らかの理由でこれが機能せず、ウィンドウが開くと値が切り替わります。どこが間違っていますか?

4

1 に答える 1

1

これは、ページの読み込み時に Web サービスを起動させる一連のイベントだと思います。

  1. デザインモードでは、このチェックボックス1 がチェックされています。
  2. このウィンドウが読み込まれる実行モードでは、InitializeComponents() (ウィンドウのコントロールを初期化するメソッド。SL ではこのメソッドの実際の名前はわかりませんが、Winforms と WPF ではその InitializeComponents) が呼び出されます。

  3. チェックボックスがオンになっているのは、デザイン モードでの方法だからです。これにより、サービスを呼び出すイベントが発生します。

1まず、データベースに値をまたはとして保存しないでください-1

0またはとして保存します1。これらは値でありint、ブール値に直接変換でき、さらにチェックボックスに割り当てることができます。truefalse

UI では、チェックボックスをオンにしないでください。データベースからデータを取得するときのウィンドウ ロードで、これを実行します。

void Windows_Loaded(....)
{
    bool i = value_from_database(); //------- Line No. 1
    checkBox1.Checked -= new RoutedEventHandler(checkBox1_Checked); //Line No. 2
    checkbox1.Ischecked = i; //------- Line No. 3
    checkBox1.Checked += new RoutedEventHandler(checkBox1_Checked); //Line No. 4
}

データベースの値をチェックボックスに割り当てると、checked イベントは発生しません (2 行目で削除されているため)。

その値を割り当てるとき。(3行目)

そのイベントを再びチェックボックスに追加します。(4行目)

于 2012-05-16T10:03:17.297 に答える