2014-09-29 60 views
0

我的表单有几个问题,可以选择一个可接受或不可接受的选项,链接到一个单选按钮。我遇到的问题是,当我检查并再次触发时,我的检查事件正在触发,当我取消选中它时,我不确定如何修改我的代码,以便每个问题答案只触发一次,这是否是正确的方法实现我在做什么,并插入答案为SQL,因为它是半从火灾事件的工作除了两次:单选按钮Check + SQL插入

string answer1 = "Acceptable"; 
string answer2 = "Not Acceptable"; 

string n1; 
string n2; 
string n3; 
string n4; 

private void btnSubmit_Click(object sender, RoutedEventArgs e) 
{ 
    SqlConnection conDatabase = new SqlConnection(String.Format(@"Data Source={0};Initial Catalog={1};Persist Security Info=True;User ID={2};Password={3}", SQLSERVER_ID, SQLDatabaseName, SQLServerLoginName, SQLServerPassword)); 
    string query = "INSERT INTO Answers(Option1, Option2, Option3, Option4) VALUES (@Option1, @Option2, @Option3, @Option4"; 

    SqlCommand cmd = new SqlCommand(query, conDatabase); 
    cmd.CommandType = CommandType.Text; 

    conDatabase.Open(); 

    cmd.Parameters.Add("@Option1", SqlDbType.NVarChar).Value = n1; 
    cmd.Parameters.Add("@Option2", SqlDbType.NVarChar).Value = n2; 
    cmd.Parameters.Add("@Option3", SqlDbType.NVarChar).Value = n3; 
    cmd.Parameters.Add("@Option4", SqlDbType.NVarChar).Value = n4; 

    cmd.ExecuteNonQuery(); 
    conDatabase.Close(); 
} 

我的XAML代码是:

<RadioButton x:Name="radio1a" GroupName="Question1" Checked="radioButton1_Checked"/> 
<RadioButton x:Name="radio1b" GroupName="Question1" Unchecked="radioButton2_Checked"/> 

<RadioButton x:Name="radio2a" GroupName="Question2" Checked="radioButton1_Checked"/> 
<RadioButton x:Name="radio2b" GroupName="Question2" Unchecked="radioButton2_Checked"/> 

最后我检查,如果点击可接受的单选按钮1,那么'n1'将被设置为应答1(可接受),并且如果点击了不可接受的单选按钮2,则'n1'将被设置为应答2(u可接受) - n1是1号(我的表单上的第一个问题):

private void radioButton1_Checked(object sender, RoutedEventArgs e) 
{ 
    Check(); 
} 

private void radioButton2_Checked(object sender, RoutedEventArgs e) 
{ 
    Check(); 
} 

public void Check() 
{ 
    if (radio1a.IsChecked == true) 
    { 
     n1 = answer1; 
    } 
    else if (radio1b.IsChecked == true) 
    { 
     n1 = answer2; 
    } 

    if (radio2a.IsChecked == true) 
    { 
     n2 = answer1; 
    } 
    else if (radio2b.IsChecked == true) 
    { 
     n2 = answer2; 
    } 
    .... etc. 
} 
+0

无法真正得到你想要的。所以每个问题有多个单选按钮有问题?当一个答案被检查,它应该开火?答案切换时是否必须再次启动?应该甚至可以切换答案吗?或者你打算通过按钮或其他方式提交所有答案吗? – C4u 2014-09-29 13:32:00

+0

@ C4ud3x每个问题有2个选项可接受或不可接受。问题1将插入到数据库的第一列,问题2将插入到第二列等。用户将完成他们所有的选择,然后单击将插入到数据库中的提交。我注意到它发射了两次,因为我有一个连接到1a/2a单选按钮的消息框,并且每当我更改为不同的选择时,它们都会出现两次。当我更改我的选择时,事件再次触发,当我检查并取消选中不应该发生的事件时。 – 2014-09-29 13:41:14

+0

如果你检查一个答案,事件被触发两次?顺便说一句:从你的if中删除“== true”。 “IsChecked”已经返回一个布尔值,所以如果(radio.IsChecked)就足够了。对于错误只是为了if(!radio.IsChecked)。 – C4u 2014-09-29 13:54:08

回答

1

好的。

想象一下,你检查你的第一个单选按钮。之后,你正在检查第二个。你的功能check()对于第一个单选按钮仍然是真的,因为它仍然被检查!

转到此方法:如果选中radioButton1或2,则获取按钮的名称。将此按钮名称传递给您的check()函数并将其切换。这样它只会触发检查过的单选按钮,而不是检查所有被检查过的单选按钮。

private void radioButton1_Checked(object sender, RoutedEventArgs e) 
    { 
     var radioFired = (RadioButton)sender; 
     Check(radioFired.Name); 
    } 

private void radioButton2_Checked(object sender, RoutedEventArgs e) 
    { 
     var radioFired = (RadioButton)sender; 
     Check(radioFired.Name); 
    } 

public void Check(string radioName) 
    { 
     switch(radioName) 
     { 
      case "radio1a": 
       n1 = answer1; 
       break; 
      case "radio1b": 
       n1 = answer2; 
       break; 
      etc... 
     } 
    } 

至于清洁编码一个提示: 有没有需要比较返回的布尔值“真”或“假”。

而不是这个..

if(radioButton.IsChecked == true) 

更好地走这条路比较真实..

if(radioButton.IsChecked) 

或类似这样的比较为假..

if(!radioButton.IsChecked) 

如果被检查,'radioButton.IsChecked'是真实的。如果该值为真,您的代码将被执行。它就像写作(如果)(真)会被执行。


如果你宁愿想留在你的代码:

删除这部分内容。没有工作。上面更好地采取我的解答。

+0

伟大的答案,我曾考虑过使用一个,但不知道如何以这种方式使用它。无论如何,开关盒正是我所需要的,现在事件正确触发,谢谢! – 2014-09-30 05:24:58

+0

很高兴我能帮助兄弟。 – C4u 2014-09-30 05:57:11