#.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);
}
}
Надеюсь, это поможет.