Текстовое поле c # показывает имя объекта вместо значения - PullRequest
0 голосов
/ 21 декабря 2018

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

т.е.

'System.Windows.Controls.SelectedItemCollection'

вместо фактического значения.

Вот весь блок кода, над которым я работаю:

Я должен был просто сделать это в начале -вот полный блок кода, над которым я работаю:

else if (theValue.FieldName.Equals("UIPathList", StringComparison.OrdinalIgnoreCase) == true)
            {
                int nRow = 14;
                Button theUIPathOptionsButton = new Button();

                TextBox theOldValueTextBox = AddLabelAndOldValue(theHelper, nRow, theValue);
                theOldValueTextBox.Text = theValue.OldValue.Replace(",", "," + Environment.NewLine);

                theUIPathOuterStackPanel = new StackPanel
                {
                    Visibility = Visibility.Visible,
                    Orientation = Orientation.Vertical,
                    Background = new SolidColorBrush(Colors.White),
                    ClipToBounds = true,
                };

                theUIPathOptionsInnerStackPanel = new StackPanel
                {
                    Visibility = Visibility.Visible,
                    Orientation = Orientation.Horizontal,
                    Background = new SolidColorBrush(Colors.White)
                };
                theUIPathOuterStackPanel.ClipToBounds = true;

                TextBox theNewTextBox = new TextBox
                {
                    TabIndex = nRow,
                    TextWrapping = TextWrapping.Wrap,
                    AcceptsReturn = true,
                };

                theNewTextBox.Clear();
                theNewTextBox.MouseDoubleClick += MultiLineChildDatapointList_HandleMouseDoubleClick;
                theNewTextBox.Focusable = true;
                theNewTextBox.HorizontalAlignment = HorizontalAlignment.Stretch;
                theNewTextBox.Width = 365;

                theNewTextBox.PreviewKeyDown += theGetMetadataHelper.Preview_KeyDown_IsMultilineText;

                theNewTextBox.Tag = theValue;

                ListBox theUIPathOptionslistBox = new ListBox();
                theUIPathOptionslistBox.Items.Add("RuntimeDefaults");
                theUIPathOptionslistBox.Items.Add("CommonSettings");
                theUIPathOptionslistBox.Items.Add(InputDatapointManager.CONST_CHANGE_RECORD_CHANGES_CLEAR_VALUE);
                theUIPathOptionslistBox.TabIndex = nRow;
                theUIPathOptionslistBox.SelectionMode = SelectionMode.Multiple;
                theUIPathOptionslistBox.ClipToBounds = true;
                theUIPathOptionslistBox.Focusable = true;
                theUIPathOptionslistBox.Visibility = Visibility.Hidden;
                theUIPathOptionslistBox.Height = 34;

                theUIPathOptionsInnerStackPanel.Children.Add(theNewTextBox);
                theUIPathOptionsInnerStackPanel.Children.Add(theUIPathOptionsButton);

                theUIPathOuterStackPanel.Children.Add(theUIPathOptionsInnerStackPanel);
                theUIPathOuterStackPanel.Children.Add(theUIPathOptionslistBox);

                void button1_click(object sender, EventArgs e)
                {
                    theUIPathOptionslistBox.Visibility = Visibility.Visible;
                }

                void button1_doubleclick(object sender, EventArgs e)
                {
                    theNewTextBox.Text = theUIPathOptionslistBox.SelectedItem.ToString();
                }

                theUIPathOptionsButton.Click += button1_click;
                theUIPathOptionslistBox.MouseDoubleClick += button1_doubleclick;

                Grid.SetColumn(theUIPathOuterStackPanel, 4);
                Grid.SetRow(theUIPathOuterStackPanel, nRow);
                theDataGrid.Children.Add(theUIPathOuterStackPanel);

                theEditControlList.Add(theNewTextBox);
            }

Ответы [ 4 ]

0 голосов
/ 09 января 2019

Решение, которое я наконец получил, было следующим:

void theUIPathOptionslistBox_SelectedIndexChanged(object sender, 
SelectionChangedEventArgs e)
{
    theNewTextBox.Clear();
    foreach (object selectedItem in theUIPathOptionslistBox.SelectedItems)
    {
        theNewTextBox.AppendText(selectedItem.ToString() + Environment.NewLine);
    }
}
theUIPathOptionslistBox.SelectionChanged += 
theUIPathOptionslistBox_SelectedIndexChanged;
0 голосов
/ 21 декабря 2018

ListBox, Item - это набор объектов, а не строк, поэтому вы должны дать ему знать, как преобразовать его в строку, в противном случае он будет использовать свою функцию defualt .ToString(), что, очевидно, объект, находящийся в настоящее время в ваших элементах, не дает желаемогорезультат.

Представьте, что элементы относятся к типу следующего класса:

class SomeClass
{
      public int Id;
      public string Name;
}

Вы можете сделать одно из этих трех:

1. установите DisplayMember вашего ListBox в Name

2. Добавьте метод переопределения в ваш класс, чтобы он переопределял свой .ToString() и возвращал свое свойство Name:

class SomeClass
{
      public int Id;
      public string Name;

      public override string ToString()
      {
            return Name;
      }
}

3. Просто приведите его к реальному типу и получитенедвижимость, которую вы хотите:

SomeClass selected = (SomeClass)ListBox.SelectedItem;
TextBox1.Text = selected.Name;
0 голосов
/ 21 декабря 2018

Здесь (возможно) уже был дан ответ: Получение значения выбранного элемента в списке в виде строки

string myItem = listBox1.GetItemText(listBox1.SelectedItem);

Затем вам просто нужно добавить свой элемент в текстовое поле:

textBox1.Text = myItem;

Если вы не хотите создавать новую строковую переменную, то эта тоже работает:

textBox1.Text = listBox1.SelectedItem.ToString();
0 голосов
/ 21 декабря 2018

Это потому, что TextBox будет использовать метод ToString() для того, с чем он связан, который по умолчанию будет возвращать имя класса.

Вы должны либо переопределить метод ToString() класса, чтобы вернуть желаемое значение, либо установить для свойства text TextBox текстовое значение, которое вы хотите, а не объект.

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