Member 14925121 Ответов: 2

Как получить значения выбранных флажков и передать их в WPF C# в виде строкового массива


Я хочу выбрать флажки из нижеприведенной формы (wpf) и передать значение в C# в виде строкового массива.
(вывод должен быть таким: тест а, тест с, тест D)

в моем коде C# при нажатии кнопки OK проверенные значения должны быть переданы и выведены в виде строки.

Вот мой пример файла xaml

<listbox x:name="Options" selectionmode="Multiple" height="287" margin="14,12,10,0" verticalalignment="Top" rendertransformorigin="0.5,0.5"> <checkbox content="TEST A" ischecked="False" fontsize="15" height="35" width="190">
<checkbox content="TEST B" ischecked="False" fontsize="15" height="35" width="100">
 <checkbox content="TEST C" ischecked="False" fontsize="15" height="35" width="100">
<checkbox content="TEST D" ischecked="False" fontsize="15" height="35" width="100" rendertransformorigin="1.923,3.075">


Может ли кто-нибудь поделиться примером кода, чтобы сделать это. Я новый пользователь wpf и C#.
Любая помощь будет оценена по достоинству.

Что я уже пробовал:

используя приведенный ниже код, я могу получить только один элемент за раз, но я хочу получить все проверенные элементы в виде строкового списка с разделением",".
private void OptOK_Click(object sender, RoutedEventArgs e)
{ 
    foreach (CheckBox item in Options.Items) 
    { 
        if (item.IsChecked == true)
        { 
            string ItemValue = item.Content.ToString();
            MessageBox.Show((ItemValue + "is checked."));
        } 
    } 
}

2 Ответов

Рейтинг:
2

TheRealSteveJudge

Вот пример того, как это сделать.

Файл MainWindow.язык XAML

<Window x:Class="CheckBoxTest.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:CheckBoxTest"

        mc:Ignorable="d"

        Title="MainWindow" Height="450" Width="800">
    
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <ListBox Name="ListBoxOptions">
            <CheckBox Content="TEST A"></CheckBox>
            <CheckBox Content="TEST B"></CheckBox>
            <CheckBox Content="TEST C"></CheckBox>
            <CheckBox Content="TEST D"></CheckBox>
        </ListBox>
        <Button Grid.Row="1"

                Width="100"

                Height="25"

                Margin="5"

                Name="ButtonShowResults"

                Content="Show Results"

                Click="ButtonShowResults_OnClick"></Button>
    </Grid>
</Window>

Файл MainWindow.язык XAML.в CS
using System.Linq;
using System.Windows;
using System.Windows.Controls;

namespace CheckBoxTest
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void ButtonShowResults_OnClick(object sender, RoutedEventArgs e)
        {
            var selectedItems = ListBoxOptions.Items.Cast<CheckBox>().Where(x => x.IsChecked == true).Select(x => x.Content).ToList();

            MessageBox.Show(string.Join("\n", selectedItems));
        }
    }
}

Краткое объяснение:
Во-первых, элементы списка, которые являются просто объектами, приводятся к флажкам, поскольку вы хотите получить доступ к их свойствам содержимого.
Затем эти флажки фильтруются по IsChecked == true.
Затем их содержимое, которое является просто IEnumerable, будет преобразовано в список.
Окончательно список будет связана с переводами строк так, что функции MessageBox покажет
напр.
ПРОВЕРИТЬ
ТЕСТ В

Если вы хотите иметь список разделенный запятыми вместо этого
вы можете заменить разделитель вот так.
string.Join(",", selectedItems)


Рейтинг:
0

Member 12901943

Должно быть очевидно, что вы получите только один за раз - окно сообщения отображается каждый раз, когда вы находите отмеченный флажок.

Вам просто нужно объединить все строки флажков в цикле, прежде чем вы отобразите окно сообщения. Что-то вроде:

private void OptOK_Click(object sender, RoutedEventArgs e)
{ 
    string ItemValue = "";

    foreach (CheckBox item in Options.Items) 
    { 
        if (item.IsChecked == true)
        { 
            if (itemValue != "") {itemValue = itemValue + ", ";}
 
            ItemValue =  ItemValue + item.Content.ToString();
        } 
    }

    MessageBox.Show((ItemValue + " is checked."));
}