Выбранный элемент списка в переменную

#.net #wpf #c#-4.0 #listbox #event-handling

#.net #wpf #c #-4.0 #listbox #обработка событий

Вопрос:

Я уже 2 дня пытаюсь сохранить выбранное значение из списка в переменную. Все предложения, которые я могу найти, не работают, и единственное предложение, которое действительно работает, было отклонено от использования. Может кто-нибудь, пожалуйста, помочь мне и сказать, что я делаю не так?

Я максимально упростил код для этой публикации. То есть как WPF, так и C #. В de code я показываю различные предложения о том, как это могло бы работать, которые я нашел на этом и других форумах.

1. Тест 01 и тест 02 компилируются нормально, но оба они дают мне один и тот же неправильный результат.

результат в текстовом поле: Система.Windows.Элементы управления.Элемент ListBoxItem: элемент ListBox 02

Глядя на результат и код, я могу отчасти понять результат для ‘Test 2’. Это выглядит как ссылка на то, что я на самом деле хочу, и ‘SelectedItem’ может подсказать это. Но затем в ‘Test 01’ я получаю тот же результат, но я запрашиваю значение вместо ссылки. Почему?

2. Наиболее распространенный предлагаемый метод — ‘Test 04’. Все, что я пробовал, выдает мне более или менее одинаковую ошибку.

Сообщение об ошибке: Ошибка компилятора CS1061: ‘ListBox’ не содержит определения для ‘GetItemText’ и не удалось найти метод расширения ‘name’, принимающий первый аргумент типа ‘type’ (вам не хватает директивы using или ссылки на сборку?).

Это также самый короткий и простой метод, поэтому мне бы очень хотелось, чтобы этот метод заработал. Возможно, я сделал что-то неправильно где-то еще (возможно, настройки в VS 2015 ???). Я уже видел это сообщение раньше, но в тот раз мне удалось его обойти.

3. И непосредственно перед тем, как решил опубликовать это здесь, я хотел попробовать еще одну вещь. ‘Test 03’ — это то, что я видел в другом сообщении на этом веб-сайте с комментарием, что это не тот способ сделать это. Хорошо, исходное сообщение было отредактировано, поэтому я не знаю, что было первоначально опубликовано, но это единственное, что действительно работало до сих пор. Тем не менее, исходное сообщение было отклонено.

Я новичок в WPF и C #. Обычно мне может потребоваться время, чтобы выяснить, как что-то сделать, но в конце концов я добираюсь туда, но на этот раз я действительно не понимаю, что произошло, и что-то подсказывает мне, что я делаю что-то неправильно. Может кто-нибудь быть настолько любезен, чтобы подробнее остановиться на одном, некоторых или всех элементах, описанных выше? Теперь у меня все заработало, но лучший ли это способ добиться этого?

Исходный код (C #):

     using System.Windows;
    using System.Windows.Controls;

    namespace NLTrader
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }

            private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                ///textBox.Text = listBox.SelectedValue.ToString();                         ///Test 01
                ///textBox.Text = listBox.SelectedItem.ToString();                          ///Test 02
                textBox.Text = ((ListBoxItem)listBox.SelectedItem).Content.ToString();      ///Test 03
                ///textBox.Text = listBox.GetItemText();                                    ///Test 04
            }
        }
    }
  

Код WPF:

     <Window x:Class="NLTrader.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:NLTrader"
            mc:Ignorable="d"
            Title="MainWindow" Height="555" Width="900">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <StackPanel 
                x:Name="mainSettings"
                Grid.Row="0">
                <ListBox 
                    x:Name="listBox"
                    SelectionChanged="listBox_SelectionChanged">
                    <ListBoxItem>ListBox Item 01</ListBoxItem>
                    <ListBoxItem>ListBox Item 02</ListBoxItem>
                    <ListBoxItem>ListBox Item 03</ListBoxItem>
                </ListBox>
            </StackPanel>
            <TextBox 
                x:Name="textBox"
                Grid.Row="1">
            </TextBox>
        </Grid>
    </Window>
  

Большое вам спасибо за ваше время и помощь.

Редактировать: p.s. Я просто замечаю, что для того, чтобы увидеть комментарии в коде, определяющие, какой из них «Тест 01», «Тест 02», «Тест 03» и «Тест 04», вам нужно будет переместить полосу прокрутки вправо.

Редактировать: я также просто замечаю, что когда я помещаю приведенный выше рабочий код в код, где он должен быть (другой проект) Я также получаю сообщение об ошибке. Последняя капля эйфории пошла насмарку … смехотворно.

Структура очень, очень похожа. код c # выглядит следующим образом.

         public void ListingAccounts_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            textBoxAccountSettingsAccountName.Text = ((ListBoxItem)ListingAccounts.SelectedItem).Content.ToString();
        }
  

Сообщение об ошибке: Необработанное исключение типа ‘System.Исключение InvalidCastException’ произошло в NLTrader.exe Дополнительная информация: Не удается привести объект типа ‘System.Строка’для ввода’System.Windows.Элементы управления.Элемент ListBoxItem’.

Скриншот из сообщения об ошибке отладчика VS2015

Итак, теперь я в еще большей растерянности, чем раньше. Пожалуйста, помогите мне.

Ответ №1:

Что он говорит при наведении курсора на SelectedItem ? Если это string (и InvalidCastException, похоже, говорит об этом), вы должны быть в состоянии сделать

  textBoxAccountSettingsAccountName.Text = ListingAccounts.SelectedItem.ToString()
  

Я бы предложил взглянуть на http://www.wpf-tutorial.com/list-controls/listbox-control / если вы еще этого не сделали.

Просто примечание: у SelectionChangedEventArgs действительно есть выбор, он там! 😛

РЕДАКТИРОВАТЬ: я не могу комментировать, но просто предупреждение в ответе @funk e.AddedItems[0] выдаст исключение indexoutofRange, когда выбор отменен (поскольку ничего не «добавлено»), поэтому вам следует использовать `e.Добавленные элементы.FirstOrDefault() и проверьте наличие null, если вы используете его решение. Я полагаю, то же самое относится и к этому решению, SelectedItem будет равен null при отмене выбора

Комментарии:

1. Привет, Эрик, я попробовал это немедленно, но теперь получаю следующее сообщение;

2. Ошибка компилятора CS0266: не удается неявно преобразовать тип ‘object’ в ‘string’. Существует явное преобразование (вам не хватает приведения?)

3. попробуйте добавить toString() (например, ListingAccounts. Выбранный элемент. toString())

4. При наведении курсора мыши на ‘SelectedItem’ я получаю следующее сообщение. система объектов. Windows. Элементы управления. Примитивы. Селектор. SelectedItem { get; set; } Возвращает первый элемент в текущей выборке или возвращает null, если выборка пуста

5. Ну, это нормально. Я забыл, что по умолчанию это объект. Не имеет значения, вызываете ли вы toString

Ответ №2:

Пара замечаний, поскольку я также столкнулся с этой проблемой сегодня. Две вещи, которые мне нужно было сделать, были довольно простыми: 1. Добавьте ссылку на сборку в мой проект: System.Windows.Формы 2. Используя руководство, опубликованное Эриком ван дер Торном, я реализовал код следующим образом;

 {

  if (upldListBox.SelectedItem != null)
  {
    string uploadFile = upldListBox.SelectedItem.ToString();
    exec.UploadToStHost(uploadFile);
  }
}
  

Надеюсь, это поможет.