Идентификация элемента списка C # - PullRequest
0 голосов
/ 26 августа 2018

Имейте в виду, я не очень опытен с c #.

Я кодирую кнопку удаления для списка и работает основная функция удаления выбранного элемента.

listBoxSum.Items.RemoveAt(listBoxSum.SelectedIndex);

Я пытаюсь сделать оператор IF, который позволит мне выбрать элемент из моего списка и заставить его идентифицировать текст внутри него (скорее всего, строку).

Поскольку я не знаю слишком много о c #, это то, что у меня сейчас есть для оператора if (очевидно, первая строка - ошибка).

if (listBoxSum.SelectedItem = "Tea")
        {
            totalCost = totalCost - teaCost;
            txtBox_Amount.Text = totalCost.ToString();
        }

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

       string teaSelect = "Tea" + teaCost;
       string selection = (string) listBoxSum.SelectedItem;

       if (selection == teaSelect)
       {
            totalCost = totalCost - teaCost;
            txtBox_Amount.Text = totalCost.ToString();
       }

Пожалуйста, помогите, я не знаю, должен ли я изменить то, как я об этом думаю, или это легко исправить, скрываясь на виду. Лично я был озадачен этой маленькой кнопкой около 2 часов, выясняя, как я собираюсь заставить кнопку удаления работать с вычислениями.

Ответы [ 3 ]

0 голосов
/ 26 августа 2018

Если вы не обновляете свой предмет, который содержит значение «Чай + стоимость», вам, вероятно, следует идентифицировать его либо по string.StartsWith, либо, возможно, присвоив ему идентификатор по вашему выбору. Это может быть целое число, перечисление или другой конкретный класс с предопределенными экземплярами.

Это можно сделать с помощью свойства Tag для WPF и создания простого класса для Windows Forms ( Свойство тега WPF ).

Простой пример для Windows Forms:

enum FoodType
{
    Tea = 2
}
class FoodItem
{
    public string Text { get; set; }
    public FoodType FoodType { get; set; }

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

Когда вы добавляете свои предметы:

listBoxSum.Items.Add(new FoodItem
{
    FoodType = FoodType.Tea,
    Text = "Tea " + teaCost
});

А когда вы их фильтруете:

if (listBoxSum.SelectedItem is FoodItem foodItem && foodItem.FoodType == FoodType.Tea)
{
    // Do work
}

WPF еще проще:

enum FoodType
{
    Tea = 1
}

Добавление предметов:

listBoxSum.Items.Add(new ListBoxItem
{
    Content = "Tea " + teaCost,
    Tag = FoodType.Tea
});

Идентификация предметов:

if (listBoxSum.SelectedItem is ListBoxItem foodItem && foodItem.Tag is FoodType foodType && foodType == FoodType.Tea)
{
    MessageBox.Show("hi");
}
0 голосов
/ 27 августа 2018

То есть ваш элемент в ListBox называется "Чай"? Если это ваш оператор if, он должен выглядеть примерно так:

if(yourTextBox.Items[yourTextBox.SelectedIndex] == "Tea")
{
    //Your Code
}
0 голосов
/ 26 августа 2018

Что вы хотите проверить, так это то, является ли элемент, который вы просматриваете в данный момент, элементом ListBoxItem и, если это так, является ли содержимое контентом текстом и равен ли этот текст вашему желаемому тексту, чтобы определить правильный элемент.

var content = (((x.SelectedItem as ListBoxItem)?.Content as string);
if (content != null && content == "MyDesiredText") {...}

Это будет правильное, но не элегантное решение. Лучшим способом было бы помнить элементы списка при их создании

var desiredListBoxItem = new ListBoxItem(...)
x.AddChild(desiredListBoxItem);

, а затем проверьте, совпадают ли ссылки на объекты:

if (x.SelectedItem == desiredListBoxItem) {...}
...