обрабатывать события выпадающего списка в приложении Windows в точечной сети (c #) - PullRequest
0 голосов
/ 19 февраля 2011

Я нашел неправильную последовательность в жизненном цикле событий в приложении Windows на C #. У меня есть 3 комбинированных списка в форме окна.

При заполнении формы первый комбобокс заполняется как

 private void Form1_Load(object sender, EventArgs e)
        {
          FillSubjects();
        }
         public void FillSubjects()
        {
            List<Subject> Subjects = objEntityManager.GetSubjects();
            if (Subjects.Count != 0)
            {   cmbSubjects.DataSource = Subjects;
                cmbSubjects.DisplayMember = "SubjectName";
                cmbSubjects.ValueMember = "SubjectId";
                CommonDataObject.SelectedSubject =    

              Convert.ToInt32(cmbSubjects.SelectedValue);
            } 
       }
        else
        {
            cmbSubjects.DataSource = null;

            cmbSubjects.Enabled = false;

        }

при изменении поля со списком cmbsubject, заполняющего поле со списком главы:

private void cmbSubjects_SelectedIndexChanged(object sender, EventArgs e)
        {
            FillChapters();
        }
  public void FillChapters()
        {           
            int subjectId = (cmbSubjects.SelectedItem as Subject).SubjectId;
            if (subjectId > 0)
            {
                List<Chapter> Chapters = new List<Chapter>();
                Chapters = objEntityManager.GetChapters(subjectId);
                if (Chapters.Count != 0)
                {

                    cmbChapters.DataSource = Chapters;
                    cmbChapters.DisplayMember = "ChapterName";
                    cmbChapters.ValueMember = "ChapterId";
                    CommonDataObject.SelectedChapter = 
                    Convert.ToInt32(cmbChapters.SelectedValue);
                }
                else
                {
                    cmbChapters.DataSource = null;
                    cmbChapters.Enabled = false;

                }
            }

        }  }

где, как в Главах Выбранный индекс изменил заполнение события

private void cmbChapters_SelectedIndexChanged(object sender, EventArgs e)
        {
           FillTopics();
        }

 public void FillTopics()
        {           

            int chpterId = (cmbChapters.SelectedItem as Chapter).ChapterId;
            if (chpterId > 0)
            {
                List<Topic> Topics = objEntityManager.GetTopics(chpterId);
                if (Topics.Count != 0)
                {
                    cmbtopics.DataSource = objEntityManager.GetTopics(chpterId);
                    cmbtopics.DisplayMember = "TopicName";
                    cmbtopics.ValueMember = "TopicId";
                    CommonDataObject.SelectedTopic =                         
                    Convert.ToInt32(cmbtopics.SelectedValue);
                }
                else
                {
                    cmbtopics.DataSource = null;
                    cmbtopics.Enabled = false;
                }
            }
        } 

Теперь проблема в том,

когда событие загрузки формы вызывается, очевидно, метод Fillsubject () вызывается в соответствии с кодом, в котором cmbSubjects получает объекты субъекта в List. но при назначении источника данных для cmbSubject вызывается его событие cmbSubjects_SelectedIndexChanged. повторное назначение при назначении DisplayMember, то же самое событие cmbSubjects_SelectedIndexChanged получает вызовы.

если наблюдать в событии cmbSubjects_SelectedIndexChanged, я вызываю метод FillChapter (). где я заполняю поле со списком cmbChapter, где то же самое происходит с cmbChapter при назначении члена источника данных и отображения, событие cmbChapters_SelectedIndexChanged получает вызовы.

Где, как и в событии cmbChapters_SelectedIndexChanged, я заполняю темы в поле со списком cmbTopic. у него нет события изменения индекса, иначе он должен вызываться при назначении источника данных и элементов отображения cmbTopics.

таким образом, количество временных событий вызывается снова и снова без необходимости. Хао, чтобы избежать этого? и почему это должно происходить? Я новичок в разработке приложений для Windows, поэтому, пожалуйста, направьте меня.

1 Ответ

1 голос
/ 21 февраля 2011

Если что-то меняет содержимое поля со списком, оно также меняет выбранный элемент, поскольку изменились элементы, доступные для выбора. Это ожидаемое поведение.

Отвечая на событие SelectedIndexChanged, вы должны знать, что ничего не может быть выбрано, и действовать соответственно. На данный момент ваш код предполагает, что SelectedItem будет ненулевым, и это не гарантируется. Вам также следует проверить, отличается ли новый выбор от предыдущего, поскольку нет смысла повторно заполнять список, если он будет содержать те же самые элементы.

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