1. 程式人生 > >C#中Combobox控制元件的SelectedIndexChanged事件的執行順序

C#中Combobox控制元件的SelectedIndexChanged事件的執行順序


這裡發生了什麼?

不是很理解控制元件執行的順序和次數。請先看程式。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace MIS_Information
{
    public partial class frmHelpdeskModify : Form
    {
        int helpdeskid;
        DataSet ds=new DataSet();
        SqlConnection cn = new SqlConnection(Properties.Settings.Default.HY_MISConnectionString);
        public frmHelpdeskModify(int helpdesk)
        {
            InitializeComponent();
            helpdeskid = helpdesk;
        }

        private void frmHelpdeskModify_Load(object sender, EventArgs e)
        {
            getHelpdesk();
            getcompany();
        }
        private void getHelpdesk()
        {
            if (helpdeskid != 0)
            {
                string sql = "Select HelpdeskID,HelpdeskUserName,Department,QuestionTitle,WhoAnswer,QuestionClassID,AnswerDetail,BeginTime,EndTime,Endsign,UserOrSystem,CompanyID From HelpdeskTable Where HelpdeskID=" + helpdeskid;
                SqlDataAdapter da = new SqlDataAdapter(sql, cn);
                cn.Open();
                da.Fill(ds, "HelpdeskTable");
                //MessageBox.Show(ds.Tables["HelpdeskTable"].Rows[0]["CompanyID"].ToString());
                cn.Close();
              }
        }
        private void getcompany()
        {
                string sql = "Select CompanyID,CompanyName From CompanyTable";
                SqlDataAdapter da = new SqlDataAdapter(sql, cn);
                cn.Open();
                da.Fill(ds, "CompanyTable");
                
                cn.Close();
                CompanyTable.DataSource = ds.Tables["CompanyTable"];
               
                CompanyTable.DisplayMember = "CompanyName";
                CompanyTable.ValueMember = "CompanyID";
                if (helpdeskid != 0) CompanyTable.SelectedValue = int.Parse(ds.Tables["HelpdeskTable"].Rows[0][11].ToString());
                MessageBox.Show("End getCompany()");
        }

        

        private void CompanyTable_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (CompanyTable.SelectedIndex >=-1)
            {
               // if (ds.Tables["DepartmentTable"] != null) ds.Tables["DepartmentTable"].Clear();
                DataRowView adv = (DataRowView)CompanyTable.SelectedItem;
                int CompanyID = int.Parse(adv.Row["CompanyID"].ToString());
                string sql = "Select DepartmentID,DepartmentName From DepartmentTable Where CompanyID=" + CompanyID;
                SqlDataAdapter da = new SqlDataAdapter(sql, cn);
                cn.Open();
                da.Fill(ds, "DepartmentTable");
                cn.Close();
                DepartmentTable.DataSource = ds.Tables["DepartmentTable"];
                
                DepartmentTable.DisplayMember = "DepartmentName";
                DepartmentTable.ValueMember = "DepartmentID";
                if (helpdeskid != 0) DepartmentTable.SelectedValue = int.Parse(ds.Tables["HelpdeskTable"].Rows[0][2].ToString());
            }
        }

    }
}

疑問一:

程式中通過斷點發現,運後selectedindexchanged事件發生了3次,不是很能理解為什麼會有三次的執行,想來想去能想到就是2次,第1次是在填充資料時,第2次是在改變資料時,第3次是什麼呢?

再想了想會不會是在初始化的時候也運行了呢?但有考慮到初始化時SelectedIndex應當是=-1的,應當不會執行呀。我在每次執行後都觀察了SelectedIndex的值,分別是:0,null,1。

這個第1次的0是填充資料時的首個值,但是第2次的null是怎麼產生的呢?第3次就是程式helpdeskid>0所產生的。

有沒有人可以指點下第2次的SelectedIndex的null值是怎麼來的呢?

週五,下班時間了,把問題稍後先放鬆會,晚點上微軟去看看。