在 Silverlight 中使用复选框

本文关键字:复选框 Silverlight | 更新日期: 2023-09-27 18:34:23

我在 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上调用 Web 服务调用。我不知道为什么。因此,通过添加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",然后我应该能够关闭窗口,再次加载它,并且应该勾选该框,但由于某种原因这不起作用,当窗口打开时, 它正在切换值。我哪里出错了?

在 Silverlight 中使用复选框

我认为这是导致您的网络服务在页面加载时被触发的事件序列。

  1. 在设计模式下,选中此复选框 1。
  2. 在运行模式下,当加载此窗口时,它会调用 InitializeComponents(((初始化窗口控件的方法。在SL中不知道此方法的真实名称,但在Winforms和WPF中,其InitializeComponents(。

  3. 在那里它选中复选框,因为这是它在设计模式下的方式。这会导致触发调用服务的事件。

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

另存为01。这些是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 行(