Проблема с ListBox
От: A_Sorokin  
Дата: 24.11.05 07:18
Оценка:
Добрый день.

Столкнулся с такой проблемой:

Есть класс Test
public class Test
{
public string str;

public Test(){}

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

В классе формы создаю один(!!!) объект этого класса.
private Test test = new Test();

Добавляю в два ListBox'a
test.str = "Test";
listBox1.Items.Add(t);
listBox2.Items.Add(t);

Как и ожидалось, в обоих отобразилось "Test".

Далее меняю test.str
test.str = "SuperTest";
но в ListBox'ах все-равно отображается "Test"

Подскажите, в чем проблема?

Проверял:
Object.ReferenceEquals(test, listBox1.Items[0]) == true;
MessageBox.Show(listBox1.Items[0].ToString());
Выводит "SuperTest", а в ListBox'ах "Test"

Спасибо.
Re: Проблема с ListBox
От: dimchick Украина  
Дата: 24.11.05 07:55
Оценка: 1 (1)
Здравствуйте, A_Sorokin, Вы писали:

A_S>Добрый день.


A_S>Столкнулся с такой проблемой:


A_S>Есть класс Test

A_S>public class Test
A_S>{
A_S> public string str;

A_S> public Test(){}


A_S> public override string ToString()

A_S> {
A_S> return str;
A_S> }
A_S>}

A_S>В классе формы создаю один(!!!) объект этого класса.

A_S>private Test test = new Test();

A_S>Добавляю в два ListBox'a

A_S>test.str = "Test";
A_S>listBox1.Items.Add(t);
A_S>listBox2.Items.Add(t);

A_S>Как и ожидалось, в обоих отобразилось "Test".


A_S>Далее меняю test.str

A_S>test.str = "SuperTest";
A_S>но в ListBox'ах все-равно отображается "Test"

A_S>Подскажите, в чем проблема?


A_S>Проверял:

A_S>Object.ReferenceEquals(test, listBox1.Items[0]) == true;
A_S>MessageBox.Show(listBox1.Items[0].ToString());
A_S>Выводит "SuperTest", а в ListBox'ах "Test"

A_S>Спасибо.


ИМХО, дело в том, что лист не знает об изменениях. А так как этот клас юзает API ф-ии, то значения, которые ты занес до изменения, закешировались в листе. Как вариант можно добавлять данные не через Items, а через DataSource. Когда что-то поменяешь, получи BindingContext от DataSource, откасть к CurrencyManager и скажи ему Refresh.
Если не подходит — то пиши так
test.str = "SuperTest";
listBox1.Items[listBox1.Items.IndexOf( test )] = test;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.