Всем добрый день!
Столкнулся с проблемой, не могу понять в чём дело.
Имеется такая структура:
public interface IMyBaseClass
{
}
public class MyBaseClass : IMyBaseClass
{
protected DataRow dataRow = null;
public MyBaseClass() { }
public MyBaseClass(DataRow dr)
{
this.dataRow = dr;
}
protected T GetFieldValue<T>(String fieldName)
{
...
}
protected void SetFieldValue<T>(String fieldName, T val)
{
...
}
}
public class MyClass : MyBaseClass
{
public string Note1
{
get { return GetFieldValue<string>(COLNAME_NOTE1); }
set { SetFieldValue<string>(COLNAME_NOTE1, value); }
}
public override String ToString()
{
return Note1;
}
}
Далее: где-то есть метод, который возвращает мне List<MyClass> myClassList. Так же есть у меня ComboBox: cBox. Что я делаю:
cBox.DataSource = myClassList;
В этот момент вызывается хэндлер cBox_SelectedIndexChanged, НО при этом cBox.SelectedIndex равен -1. При том, что список элементов приходит нормальный(3 элемента, нормально инициализированных).
Я решил, что это может быть потому, что у меня не переопределён метод int GetHashCode() в MyClass, но и это не помогло(я возвращал там "ToString().GetHashCode();").
Посоветуйте, что делать, пожалуйста. Я чувствую что чего-то не хватает, но чего?
Спасибо заранее!
01.06.09 22:39: Перенесено модератором из '.NET' — AndrewVK
Здравствуйте, samius, Вы писали:
S>Здравствуйте, J-Pro, Вы писали:
JP>>В этот момент вызывается хэндлер cBox_SelectedIndexChanged, НО при этом cBox.SelectedIndex равен -1. При том, что список элементов приходит нормальный(3 элемента, нормально инициализированных).
S>Значение SelectedIndex, равное -1, означает что ни один элемент не выделен. Учтите это в своих классах.
Почему тогда:
1. Если cBox.DataSource'у присвоить список String'ов, то сразу выделяется первый элемент и в хэндлере при этом cBox.SelectedIndex
НЕ равен -1?
2. Если в методе cBox_SelectedIndexChanged написать:
cBox.SelectedIndex = 1;
, то он уходит в бесконечную рекурсию, в которой cBox.SelectedIndex никогда не равен 1? Как же тогда из кода выделить элемент?
Что-то тут не так.
Здравствуйте, J-Pro, Вы писали:
JP>Здравствуйте, samius, Вы писали:
S>>Здравствуйте, J-Pro, Вы писали:
JP>>>В этот момент вызывается хэндлер cBox_SelectedIndexChanged, НО при этом cBox.SelectedIndex равен -1. При том, что список элементов приходит нормальный(3 элемента, нормально инициализированных).
S>>Значение SelectedIndex, равное -1, означает что ни один элемент не выделен. Учтите это в своих классах.
JP>Почему тогда:
JP>1. Если cBox.DataSource'у присвоить список String'ов, то сразу выделяется первый элемент и в хэндлере при этом cBox.SelectedIndex НЕ равен -1?
Не сразу. Вообще-то SelectedIndex при смене выделения меняется дважды. Первый раз на -1, второй раз на индекс выделенного элемента.
JP>2. Если в методе cBox_SelectedIndexChanged написать:
JP>JP>cBox.SelectedIndex = 1;
JP>
JP>, то он уходит в бесконечную рекурсию, в которой cBox.SelectedIndex никогда не равен 1? Как же тогда из кода выделить элемент?
Все верно. Присваивание SelectedIndex-а порождает череду (не одно) событий SelectedIndexChanged. Если вы присваиваете новое значение внутри обработчика, то кроме рекурсии ничего хорошего не получите.
Из кода выделить элемент можно, но делать это надо не в обработчике SelectedIndexChanged! Можно и в нем, но очень аккуратно, с проверкой текущего индекса, чтобы не уйти в рекурсию.
JP>Что-то тут не так.
Здравствуйте, J-Pro, Вы писали:
JP>Всем добрый день!
JP>Столкнулся с проблемой, не могу понять в чём дело.
JP>Имеется такая структура:
JP>JP>public interface IMyBaseClass
JP>{
JP>}
JP>public class MyBaseClass : IMyBaseClass
JP>{
JP> protected DataRow dataRow = null;
JP> public MyBaseClass() { }
JP> public MyBaseClass(DataRow dr)
JP> {
JP> this.dataRow = dr;
JP> }
JP> protected T GetFieldValue<T>(String fieldName)
JP> {
JP> ...
JP> }
JP> protected void SetFieldValue<T>(String fieldName, T val)
JP> {
JP> ...
JP> }
JP>}
JP>public class MyClass : MyBaseClass
JP>{
JP> public string Note1
JP> {
JP> get { return GetFieldValue<string>(COLNAME_NOTE1); }
JP> set { SetFieldValue<string>(COLNAME_NOTE1, value); }
JP> }
JP> public override String ToString()
JP> {
JP> return Note1;
JP> }
JP>}
JP>
JP>Далее: где-то есть метод, который возвращает мне List<MyClass> myClassList. Так же есть у меня ComboBox: cBox. Что я делаю:
JP>JP>cBox.DataSource = myClassList;
JP>
JP>В этот момент вызывается хэндлер cBox_SelectedIndexChanged, НО при этом cBox.SelectedIndex равен -1. При том, что список элементов приходит нормальный(3 элемента, нормально инициализированных).
JP>Я решил, что это может быть потому, что у меня не переопределён метод int GetHashCode() в MyClass, но и это не помогло(я возвращал там "ToString().GetHashCode();").
JP>Посоветуйте, что делать, пожалуйста. Я чувствую что чего-то не хватает, но чего?
JP>Спасибо заранее!
Ну вот, так всегда бывает. Трахаешься целый день, не находишь решения, потом тратишь минут 10 на описание проблемы в форуме, постишь и через полчаса сам находишь проблему

Так и тут. В общем, свойство Note1 всегда было null. Неверное поле брал я из DataRow, вот и всё. Элемент не мог отобразиться, вот вам и -1 в SelectedIndex.
Всем спасибо!