繁体   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