今天要讲的是关于WPF的对应关系下拉框绑定事件,为什么要讲呢?是因为现在在做的某一个功能需要用到这个,所以想分享给大家。
关于这个下拉框的问题就是,经理与部门的关系,当点击经理下拉框并选中好之后,它对应的部门下拉框就得出现经理所属的部门,由于我数据库设计的是员工表里面有经理ID和部门ID,原因是经理也是员工之一就把经理ID放在员工表里面,刚好员工表里面也需要部门ID,所以就放在一起。(PS:如果这样设表有问题!请提出!)对于这个问题我想了半天,终于想到了。
第一步:先把问题的思路理清了,在想功能怎么做,由于我没理清思路,导致出现问题,后来解决了。首先打开数据库,在数据库写绑定经理和部门下拉框的代码。我们先写经理下拉框先,我在这里的查询与其他不同,是应为我设的表ID都在同一张表上,所以要查询的方法有所不同,我是用ORACLE的查询方法写的(如果有其他方法,就用其他方法,我这只是参考)。
代码:
IF(@type='Window_Manager')
BEGIN
SELECT RTRIM(U.ManagerID) AS ID,
RTRIM(Q.S_Name) AS Name
FROM SYS_Staff U,SYS_Staff Q
WHERE U.ManagerID = Q.StaffID
END
解释:RTRIM是去空格,AS是重命名,U.ManagerID和Q.S_Name 是经理ID和姓名,前面的字母是为了区分关系(我是这么理解的),前面的SELECT是获取你需要的数据,FROM是获取数据的表,由于是同一张表,所以要写两个,后面跟着是对应上面的字母,然后在写WHERE语句,为的是区分,不写的话会有多余数据,是假数据。
写完经理下拉框,就写部门下拉框。
代码:
IF(@type='Window_Department')
BEGIN
SELECT RTRIM(SYS_Staff.ManagerID) AS M_ID,
RTRIM(SYS_Department.DepartmentID) AS D_ID,
RTRIM(SYS_Department.DepartmentName) AS D_NAME
FROM SYS_Staff INNER JOIN
SYS_Department ON SYS_Staff.DepartmentID = SYS_Department.DepartmentID
WHERE SYS_Staff.ManagerID=@ManagerID
and SYS_Staff.DepartmentID=@DepartmentID
END
解释:直接查询员工表里的经理ID和部门表的部门名称和ID,这是一个多表查询,然后在写一个WHERE语句,意思就是当查询出数据时,以经理ID和部门ID为中心点,把对应的部门数据查出来(简单意思就是把经理ID和部门ID对应的筛选出来就行了),之前就是因为以部门ID和经理ID两个中的一个为中心点,查询出的数据有一些是重复的。
比如:有三条数据如下,当员工是1,对应的经理是1,下面的2员工对应的经理也是1,查询出的部门数据会重复的,所以要以经理ID和部门ID为中心点。
员工、经理ID、部门ID、部门名称
1 1 1 1部门
2 1 2 1部门
3 2 2 2部门
第二步:在服务端写。
代码:
//定义操作契约(绑定经理)
[OperationContract]
public DataSet Window_Manager()
{
//实例化对象数组
SqlParameter[] mySqlParameter =
{
//定义传递参数,以及传递参数的类型
new SqlParameter("@type",SqlDbType.NChar),
};
mySqlParameter[0].Value = "Window_Manager";
DataTable myDataTable = myDALMethod.QueryDataTable("UC_BuyAccept", mySqlParameter);
DataSet myDataSet = new DataSet();
myDataSet.Tables.Add(myDataTable);
return myDataSet;
}
//定义操作契约(绑定经理部门ID)
[OperationContract]
public DataSet Window_Department(int intManagerID)
{
//实例化对象数组
SqlParameter[] mySqlParameter =
{
//定义传递参数,以及传递参数的类型
new SqlParameter("@type",SqlDbType.NChar),
new SqlParameter("@ManagerID",SqlDbType.Int)
};
mySqlParameter[0].Value = "Window_Department";
mySqlParameter[1].Value = intManagerID;
DataTable myDataTable = myDALMethod.QueryDataTable("UC_BuyAccept", mySqlParameter);
DataSet myDataSet = new DataSet();
myDataSet.Tables.Add(myDataTable);
return myDataSet;
}
解释:把数据库的数据传过来,实例化对象数组,定义传递参数,以及传递参数的类型。
第三步:客户端写绑定下拉框的代码
代码:
//绑定客户经理
DataTable dtManager = myClient.Window_Manager().Tables[0];
cbo_Manager.ItemsSource = dtManager.DefaultView;
cbo_Manager.DisplayMemberPath = "Name";
cbo_Manager.SelectedValuePath = "ID";
解释:在页面上面写一个Loaded事件,在Loaded事件里存放下拉框的代码。
然后在客户经理的ComboBox里写一个SelectionChanged事件,用来存放客户经理下拉框改变事件的。
代码:
private void Txt_Manager_SelectionChanged(object
sender,electionChangedEventArgs e)
{
int intManagerID = Convert.ToInt32(cbo_Manager.SelectedValue);
if (intManagerID >0)
{
#region 绑定下拉框(部门表)
DataTable dtDepartment =
myClient.Window_Department(intManagerID).Tables[0];
cbo_Department.ItemsSource = dtDepartment.DefaultView;
cbo_Department.DisplayMemberPath = "D_NAME";
cbo_Department.SelectedValuePath = "D_ID";
cbo_Department.SelectedValuePath = "M_ID";
#endregion
}
}