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 服务,并且值正在切换。

我的问题是,当加载子窗口时,由于某种原因,这会在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. 它在那里检查复选框,因为这是它在设计模式下的方式。这会导致调用您的服务的事件被触发。

首先不要将数据库中的值保存为1or -1

另存为01。这些是int值,可以直接转换为布尔值,true并且false可以进一步分配给您的复选框。

在 UI 中不要选中您的复选框。在从数据库中检索数据时的 Window Load 中,执行此操作

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
}

当您将数据库值分配给复选框时,它的选中事件将不会触发(因为它已被第 2 行删除)。

现在,当它为它分配该值时。(第 3 行)

我们将再次将该事件添加到我们的复选框中。(第 4 行)

于 2012-05-16T10:03:17.297 回答