Как создать поля со списком Dynami c в панели стека в wpf, получить их значения и удалить их - PullRequest
0 голосов
/ 24 марта 2020

Я хочу создать динамические c комбинированные списки в панели стека wpf, получить их значения и удалить их, когда пользователь вводит число в текстовое поле. Ниже приведен код, который я использовал, когда пользователь вводит число в текстовое поле (для TextEventChaged), чтобы добавить комбинированные списки в панель стека (например, VehiclesPerday):

<TextBox x:Name="NumberOfVehciles" FontSize="15" HorizontalAlignment="Left" Height="40" TextChanged="NumberOfVehciles_TextChanged"/>
<WrapPanel x:Name="VehiclesPerday" HorizontalAlignment="Left">
</WrapPanel>

BackEnd

private void NumberOfVehciles_TextChanged(object sender, TextChangedEventArgs e)
{

    int _count = Convert.ToInt32(NumberOfVehciles.Text.Trim());

    for (int x = 1; x <= _count; x++)
    {
        ComboBox cmb = new ComboBox();
        cmb.Name = "cmbd" + x.ToString();
        cmb.Height = 40;
        cmb.HorizontalAlignment = HorizontalAlignment.Left;
        cmb.FontSize = 15;
        cmb.Width = 200;
        cmb.VerticalAlignment = VerticalAlignment.Top;
        cmb.Margin = new Thickness(50, 40, 0, 0);
        VehiclesPerday.Children.Add(cmb);
    }
}

SubmitButton для извлечения данных, которые я пробовал, при отладке показывает нулевое значение для comboxbox

private void SubmitButton_Click(object sender, RoutedEventArgs e)
{
    int _count = Convert.ToInt32(NumberOfVehciles.Text.Trim());

    for (int x = 1; x <= _count; x++)
    {
        ComboBox _vehicle = (ComboBox)this.VehiclesPerday.FindName("cmbd" + x.ToString());
    }
}

А также, когда пользователь изменяет значение в текстовом поле, он должен удалить поля со списком созданный в панели стека и сделать наоборот после изменения его значения, например. Если пользователь в начале go вводит 2 в текстовом поле, следует создать 2 поля со списком. Теперь, если пользователь хочет изменить значение с 2 на 1, он должен удалить созданные поля со списком из панели стека и создать заново.

1 Ответ

0 голосов
/ 24 марта 2020
  • Я добавил проверку, если текст в вашем текстовом поле является числом и может быть преобразован в int
  • Добавлен вызов VehiclesPerday.Children.Clear() только для тестов
  • Добавлен foreach l oop, чтобы найти ComboBox по Name
private void NumberOfVehciles_TextChanged(object sender, TextChangedEventArgs e)
{
    if (int.TryParse(NumberOfVehciles.Text.Trim(), out int _count))
    {
        VehiclesPerday.Children.Clear(); // for tests
        for (int x = 1; x <= _count; x++)
        {
            ComboBox cmb = new ComboBox // Visual studio simplified object creation here
            {
                Name = "cmbd" + x.ToString(),
                Height = 40,
                HorizontalAlignment = HorizontalAlignment.Left,
                FontSize = 15,
                Width = 200,
                VerticalAlignment = VerticalAlignment.Top,
                Margin = new Thickness(50, 40, 0, 0)
            };
            VehiclesPerday.Children.Add(cmb);
        }
    }
}
private void SubmitButton_Click(object sender, RoutedEventArgs e)
{
    if (int.TryParse(NumberOfVehciles.Text.Trim(), out int _count))
    {
        for (int x = 1; x <= _count; x++)
        {
            ComboBox _vehicle = null;
            foreach (ComboBox box in VehiclesPerday.Children)
            {
                if (box.Name == "cmbd" + x.ToString())
                {
                    _vehicle = box; // ComboBox found
                    break;
                }
            }
            MessageBox.Show(_vehicle?.Name ?? "ComboBox not found!"); 
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...