Permalänk

CSharp radiobutton

Hur gör man för att skapa radiobuttons i C# på ett smidigt sätt med hjälp av toolboxen i designläget? Dvs inte skriva koden själv för att rita upp dem utan använda toolboxen. Måste man ändra funktionen manuellt för att peka till samma funktion?

Har för mig att jag har kunnat knyta radiobuttons till en array istället och sen använda sig av en foreach loop och iterera över tills man hittar en radiobutton som är i checkad. Detta gjorde jag dock i Visual C++ men osäker om det även går i C#.

Jag klickade på "radioButton1" i GUI och fick fuktionen nedan(tog bort ettan med refaktor). Skrev sedan in funktionen manuellt på de andra radiobuttons se bild ovan.

private void radioButton_Checked(object sender, RoutedEventArgs e) { if ( this.radioButton1.Checked) { label.Text = radioButton1; } else if (this.radioButton2.Checked) { label.Text = radioButton2; } else if (this.radioButton3.Checked) { label.Text = radioButton3; } else if (this.radioButton4.Checked) { label.Text = radioButton4; } }

Varför klagar C# på Checked? Varför kan inte Text hittar på label? Borde inte de vara tillgängliga i funktionen radioButton_Checked?

Finns det något lättare sätt att lösa det här problemet på?

Permalänk
Skrivet av GainerPRO:

Hur gör man för att skapa radiobuttons i C# på ett smidigt sätt med hjälp av toolboxen i designläget? Dvs inte skriva koden själv för att rita upp dem utan använda toolboxen. Måste man ändra funktionen manuellt för att peka till samma funktion?

Har för mig att jag har kunnat knyta radiobuttons till en array istället och sen använda sig av en foreach loop och iterera över tills man hittar en radiobutton som är i checkad. Detta gjorde jag dock i Visual C++ men osäker om det även går i C#.

http://img99.imageshack.us/img99/5282/radiobutton.png

Jag klickade på "radioButton1" i GUI och fick fuktionen nedan(tog bort ettan med refaktor). Skrev sedan in funktionen manuellt på de andra radiobuttons se bild ovan.

private void radioButton_Checked(object sender, RoutedEventArgs e) { if ( this.radioButton1.Checked) { label.Text = radioButton1; } else if (this.radioButton2.Checked) { label.Text = radioButton2; } else if (this.radioButton3.Checked) { label.Text = radioButton3; } else if (this.radioButton4.Checked) { label.Text = radioButton4; } }

Varför klagar C# på Checked? Varför kan inte Text hittar på label? Borde inte de vara tillgängliga i funktionen radioButton_Checked?

Finns det något lättare sätt att lösa det här problemet på?

Förstår inte riktigt vad du vill göra. Vill du kolla om radiobuttonx är "checked"?

EDIT: Plus att detta

label.Text = radioButton3;

fungerar inte.
Man kan inte konvertera det till "string".

Visa signatur
Permalänk
Hedersmedlem
Skrivet av GainerPRO:

Varför klagar C# på Checked? Varför kan inte Text hittar på label? Borde inte de vara tillgängliga i funktionen radioButton_Checked?

Om man tittar i xaml-filen ser man att Checked är en händelse (som för närvarande hanteras av radioButton_Checked). Egenskapen du söker är IsChecked. Och för att ange texten hos en Label används Content.

Permalänk

Har ändrat nu men kompilatorn gillar fortfarande inte IsChecked().

Tack för att du löste problemet med label

namespace radioButton { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void radioButton_Checked(object sender, RoutedEventArgs e) { if (radioButton1.IsChecked()) { label.Content = "radioButton1"; } else if (this.radioButton2.IsChecked()) { label.Content = "radioButton2"; } else if (this.radioButton3.IsChecked()) { label.Content = "radioButton3"; } else if (this.radioButton4.IsChecked()) { label.Content = "radioButton4"; } } } }

Eller är enda lösningen att göra det så här?

private void radioButton1_Checked(object sender, RoutedEventArgs e) { label.Content = "radioButton1"; } private void radioButton2_Checked(object sender, RoutedEventArgs e) { label.Content = "radioButton2"; } private void radioButton3_Checked(object sender, RoutedEventArgs e) { label.Content = "radioButton3"; } private void radioButton4_Checked(object sender, RoutedEventArgs e) { label.Content = "radioButton4"; }

Permalänk
Medlem

Det ska vara IsChecked och inte IsChecked(). Dvs, ta bort parantesen.

Skickades från m.sweclockers.com

Permalänk

Jag får fel med och utan paranteser på IsChecked

utan: IsChecked
Error 1 Cannot implicitly convert type 'bool?' to 'bool'. An explicit conversion exists (are you missing a cast?)
c:\visual studio 2010\Projects\radioButton\radioButton\MainWindow.xaml.cs 30 17 radioButton

med IsChecked()
Error 1 Non-invocable member 'System.Windows.Controls.Primitives.ToggleButton.IsChecked' cannot be used like a method.
c:\visual studio 2010\Projects\radioButton\radioButton\MainWindow.xaml.cs 30 30 radioButton

Permalänk
Hedersmedlem
Skrivet av GainerPRO:

Error 1 Cannot implicitly convert type 'bool?' to 'bool'.

Det beror på att det rör sig om en bool? (som även kan ha värdet null) och inte en vanlig bool. Ändra lämpligen till

if(radioButton1.IsChecked == true)

Permalänk

Inte för att jag är så bra på C#, men detta känns bara helt fel.

label.Content = "radioButton4";

Visa signatur
Permalänk

Tack hittade det med på MSDN:

This is not allowed because it is unclear what null means in the context of a conditional. To use a bool? in a conditional statement, first check its HasValue property to ensure that its value is not null, and then cast it to bool. For more information, see bool. If you perform the cast on a bool? with a value of null, a InvalidOperationException will be thrown in the conditional test. The following example shows one way to safely cast from bool? to bool:

Permalänk
Hedersmedlem
Skrivet av Kebabhyvlarn:

Inte för att jag är så bra på C#, men detta känns bara helt fel.

label.Content = "radioButton4";

Välkommen till wpf (men reagerar du inte ännu allvarligare mot xaml-kod?)...

Permalänk

Har ändrat xaml koden till:

<Grid> <RadioButton Content="RadioButton1" Height="21" HorizontalAlignment="Left" Margin="12,10,0,0" Name="radioButton1" VerticalAlignment="Top" Width="107" Checked="radioButton_Checked" IsChecked="True" /> <RadioButton Content="RadioButton2" Height="21" HorizontalAlignment="Left" Margin="12,30,0,0" Name="radioButton2" VerticalAlignment="Top" Width="107" Checked="radioButton_Checked"/> <RadioButton Content="RadioButton3" Height="21" HorizontalAlignment="Left" Margin="12,50,0,0" Name="radioButton3" VerticalAlignment="Top" Width="107" Checked="radioButton_Checked"/> <RadioButton Content="RadioButton4" Height="21" HorizontalAlignment="Left" Margin="12,70,0,0" Name="radioButton4" VerticalAlignment="Top" Width="107" Checked="radioButton_Checked"/> <Label Content="Label" Height="28" HorizontalAlignment="Left" Margin="12,112,0,0" Name="label1" VerticalAlignment="Top" Width="103" /> </Grid>

och även:

if (radioButton1.IsChecked == true) { label1.Content = "radioButton1"; } else if (radioButton2.IsChecked == true) { label1.Content = "radioButton2"; } else if (radioButton3.IsChecked == true) { label1.Content = "radioButton3"; } else if (radioButton4.IsChecked == true) { label1.Content = "radioButton4"; }

Men fortfarande fungerar detta inte :(. Har jag gjort alla fel man kan tänkas göra nu?

Permalänk
Hedersmedlem
Skrivet av GainerPRO:

Tack hittade det med på MSDN:

This is not allowed because it is unclear what null means in the context of a conditional. To use a bool? in a conditional statement, first check its HasValue property to ensure that its value is not null, and then cast it to bool. For more information, see bool. If you perform the cast on a bool? with a value of null, a InvalidOperationException will be thrown in the conditional test. The following example shows one way to safely cast from bool? to bool:

Om du vet att det är just fallet när det är true du är ute efter kan man dock jämföra direkt (som ovan). Lite lurigare är det om man verkligen behöver konvertera värdet, som i:

bool? a = true; bool b = (bool)a; <-- här bör man göra som ovan, dvs. kanske bool b = false; if(a.HasValue) b = (bool)a;

Man kan dock använda ??-operatorn för att åstadkomma detsamma:

bool b = a??false;

om a är null används alltså false och annars det värde som a har.

Permalänk

Tack för ditt svar Elgot att använda radiobuttons var vist svårare än jag trodde.

Får dock inte till label än läser i en bok nu att jag ska ändra något som heter "UseMnemonic" egenskapen men kan inte hitta den. Verkar som inte label får någon instans om inte den är satt. Jag använder Visual Studio 2010 men boken är för 2008. Något som ändrats i senare utgåva eller är jag helt ut och cyklar nu igen?

Permalänk
Hedersmedlem
Skrivet av GainerPRO:

Verkar som inte label får någon instans om inte den är satt.

Om det kraschar vid uppstart kan det bero på att radioButton1 tilldelas värdet True innan label1 har initierats och att radioButton_Checked försöker använda label1 när den är null. Testa

if (label1 != null) { if (radioButton1.IsChecked == true) { label1.Content = "radioButton1"; } else if (radioButton2.IsChecked == true) { label1.Content = "radioButton2"; } else if (radioButton3.IsChecked == true) { label1.Content = "radioButton3"; } else if (radioButton4.IsChecked == true) { label1.Content = "radioButton4"; } }

Permalänk

Aha tack du är ju grym på programmering eller så är det jag som är extremt dålig.

Nu fungerar det iallafall som jag tänkte mig:)

Nu ska jag gå vidare till checkboxes:P. Nej nu ger jag upp nu blir det sängen istället.

Tack än en gång för all hjälp