簡體   English   中英

在點網(C#)中處理Windows應用程序中的組合框事件

[英]handle combobox events in windows application in dot net (c#)

我在c#中的Windows應用程序中發現了事件生命周期中的一些錯誤序列。 我的Windows窗體中有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中的subject對象填充。 但是將數據源分配給cmbSubject時,將調用其cmbSubjects_SelectedIndexChanged事件。 在分配DisplayMember時再次分配,相同的cmbSubjects_SelectedIndexChanged事件獲取調用。

如果在cmbSubjects_SelectedIndexChanged事件中觀察到,我正在調用FillChapter()方法。 在我填充cmbChapter組合框的地方,在分配數據源和Display成員時,與cmbChapter發生的情況相同,cmbChapters_SelectedIndexChanged事件獲取調用。

在cmbChapters_SelectedIndexChanged事件中,我在cmbTopic組合框中填充主題。 它沒有索引更改事件,否則在將數據源和顯示成員分配給cmbTopics時必須調用它。

通過這種方式,不必要地一次又一次地調用了許多時間事件。 好避免這種情況? 為什么會這樣呢? 我是Windows應用程序開發的新手,請指導我。

如果某項更改了組合框的內容,它也會更改所選的項目,因為可從中選擇的項目已更改。 這是預期的行為。

響應SelectedIndexChanged事件時,應注意可能沒有選擇任何內容,因此應采取相應的措施。 目前,您的代碼假定SelectedItem將為非null,並且不能保證。 您還應該檢查新選擇是否與先前選擇不同,因為如果列表包含相同內容,則沒有必要重新填充列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM