Как вытащить элемент и подпункты списка просмотра выбранной записи - PullRequest
1 голос
/ 10 апреля 2019

Я хотел бы отредактировать элемент списка, состоящий из 2-х строк и 3-х строк. Я сохраняю элементы в виде списка из открытого класса "Rineitem". Я могу назначить выбранную строку объекту и увидеть его в окне локальных компьютеров, но я не знаю, как к нему добраться или его подэлементам.

Я пытался найти примеры, но не нашел ничего настолько простого, как это должно быть. Мои собственные попытки часто давали сообщения о том, что, возможно, я забыл актерский состав! ??? Если я преобразую объект в строку, я получу текст с именем открытого класса.

object item = lvw_Smd_Jobs.SelectedItem;

Когда я пытаюсь назначить lvw selectedItem классу, который я получаю, невозможно неявно преобразовать тип 'object' в 'Rin ... Auftrag_Verwalter.Rineitem'. Существует явное преобразование (вам не хватает приведения?) Я хотел бы сохранить два строковых значения в текстовых полях, где пользователь может изменить значения, а затем я бы сохранил элемент списка с его изменениями.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Вы можете привести «ListBoxItem» (тип объекта) к классу, которым он действительно является.

Вот небольшой пример того, как добавлять, читать и изменять элементы в вашем ListBox:

// Example class
public class RineItem
{
    public string Name { get; set; }
    public int Id { get; set; }

    // Override ToString() for correct displaying in listbox
    public override string ToString()
    {
        return "Name: " + this.Name;
    }
}

public MainWindow()
{
    InitializeComponent();

    // Adding some examples to our empty box
    this.ListBox1.Items.Add(new RineItem() { Name = "a", Id = 1 });
    this.ListBox1.Items.Add(new RineItem() { Name = "b", Id = 2 });
    this.ListBox1.Items.Add(new RineItem() { Name = "c", Id = 3 });
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    // Loop through SelectedItems
    foreach (var item in this.ListBox1.SelectedItems)
    {
        // Have a look at it's type. It is our class!
        Console.WriteLine("Type: " + item.GetType()); 
        // We cast to the desired type
        RineItem ri = item as RineItem;
        // And we got our instance in our type and are able to work with it.
        Console.WriteLine("RineItem: " + ri.Name + ", " + ri.Id); 

        // Let's modify it a little
        ri.Name += ri.Name;
        // Don't forget to Refresh the items, to see the new values on screen
        this.ListBox1.Items.Refresh();
    }
}

Сообщение об ошибке, с которым вы сталкиваетесь, говорит вам, что не существует неявного приведения для преобразования object в и RineItem.

Возможны неявные приведения (от int до long). И вы можете создавать свои собственные. Вот пример:

public class RineItem2
{
    public string Name2 { get; set; }
    public int Id2 { get; set; }

    public static implicit operator RineItem(RineItem2 o)
    {
        return new RineItem() { Id = o.Id2, Name = o.Name2 };
    }
}

Теперь вы можете сделать это:

RineItem2 r2 = new RineItem2();
RineItem r = r2;

Но это следует использовать, только если каждый объект из класса RineItem2 может быть приведен к RineItem.

Приведение с object на RineItem должно работать каждый раз! Следовательно, вы не знаете, к какому типу относится ваш объект, к которому вы не имеете права:

object o = "bla bla";
RineItem r = (RineItem)o; // Not allowed! Will not work!
0 голосов
/ 10 апреля 2019

Во-первых, почему бы не сохранить все предметы в виде строк, чтобы ваш кастинг был упрощен.

Затем, чтобы удалить выбранный предмет.Вы бы сделали следующее

var item = (string) lvw_Smd_Jobs.SelectedItem;lvw_Smd_Jobs.Items.Remove (пункт);

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