在 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",然后我应该能够关闭窗口,再次加载它,并且应该勾选该框,但由于某种原因这不起作用,当窗口打开时, 它正在切换值。我哪里出错了?
我认为这是导致您的网络服务在页面加载时被触发的事件序列。
- 在设计模式下,选中此复选框 1。
-
在运行模式下,当加载此窗口时,它会调用 InitializeComponents(((初始化窗口控件的方法。在SL中不知道此方法的真实名称,但在Winforms和WPF中,其InitializeComponents(。
-
在那里它选中复选框,因为这是它在设计模式下的方式。这会导致触发调用服务的事件。
首先不要将数据库中的值保存为 1
或 -1
。
另存为0
或1
。这些是int
值,可直接转换为布尔值的true
和false
,可以进一步分配给您的复选框。
在 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 行(