[英]Sending keyboard events to another application in C# that does not handle Windows events
[英]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.