2016-12-29 4 views
-4

У меня есть список, где элементы являются структурой. Эта структура содержит две строки. Один для названия, а другой для обычного текста. Теперь я хочу изменить текст в существующем элементе в списке. Есть ли способ сделать это без удаления существующего и добавления обновленной версии в список?C# Измените значение переменной в существующем элементе списка

Это то, что я хочу сделать,

((TextItemRecord) listbox1.Items[myListbox1.BeforeIndex]).text = "Blablabla"; 

Компилятор говорит, «Невозможно изменить результат преобразования» распаковки, когда я пытаюсь сделать это. Любые решения?

Struct,

struct TextItemRecord 
{ 
    public UInt64 address; 
    public string name, text; 

    public TextItemRecord(UInt64 address, string name) 
    { 
     this.address = address; 
     this.name = name; 
     this.text = ""; 
    } 
    public override string ToString() 
    { 
     return name; 
    } 
} 

Мне жаль людей, я понятия не имею, как этот сайт должен работать

+0

Youre собираешься нужно, чтобы дать нам код, чтобы помочь вам –

+0

Привет, вы можете проверить эту ссылку, чтобы выяснить, как это работает. http://stackoverflow.com/help/how-to-ask, вам нужно помочь нам, чтобы помочь вам. –

+0

Посмотрите на [это] (http://stackoverflow.com/questions/17280547/why-can-i-not-modify-the-result-of-an-unboxing-conversion) –

ответ

0

Обратитесь к следующей ссылке rename an item in listbox. Я считаю, что это прояснит кое-что. Поскольку не упоминалось триггер Event, который меняет текст, я не буду этого делать. Вы можете перебрать все предметы и вызвать атрибут SelectedIndex изменить каждый текст следующим образом:

foreach(var item in listbox1) 
     listbox1.Items[item.SelectedIndex] = "Blablabla"; 
0

Во-первых структуры являются значения типа не ссылочного типа. Это означает, что единственным способом изменить значение поля является создание копии с изменением и замена того, с которого вы скопировали. Поэтому я бы предложил изменить его на класс. Кроме того, поскольку ListBox использует метод ToString() для отображения элементов, я хотел бы предложить изменения, что позволит text поля будет показано:

class TextItemRecord 
{ 
    public UInt64 address; 
    public string name; 
    public string text; 

    public TextItemRecord(UInt64 address, string name) 
    { 
     this.address = address; 
     this.name = name; 
     this.text = ""; 
    } 
    public override string ToString() 
    { 
     return $"{name} - {text}"; 
    } 
} 

Теперь, чтобы отобразить список элементов в Listbox присвоить свойство DataSource для в списке:

List<TextItemRecord> test; 
public Form1() 
{ 
    InitializeComponent(); 

    test = new List<TextItemRecord>() 
    { 
     new TextItemRecord(1234, "AAA"), 
     new TextItemRecord(5678, "BBB"), 
     new TextItemRecord(9012, "CCC") 
    }; 
    listBox1.DataSource = test; 
} 

Изменение элементов в ListBox и изменение показаний немного сложнее. Вот один метод, который работает:

private void AddText(List<TextItemRecord> tirList, int index, string text) 
{ 
    BindingManagerBase bmb = listBox1.BindingContext[test]; 
    bmb.SuspendBinding(); 
    test[index].text = text; 
    bmb.ResumeBinding(); 
} 
+0

Если я понимаю вас правильно, значения хранятся в «List test;», а список - только визуальное представление. – Bas

+0

Извините, я не закончил набирать текст, и по какой-то причине я не могу редактировать. Если вы правильно поняли, значения хранятся в «List test;», а список - только визуальное представление. На самом деле это не так, как я хотел это сделать. Я хотел сохранить элементы в самом списке. – Bas

+0

Со списком в качестве источника данных список будет хранить элементы из списка в виде объектов. Он будет представлять объекты с помощью метода ToString(). Связывая список, вы можете вносить изменения в имя и/или текст, и изменения будут отображаться в списке. – tinstaafl

Смежные вопросы