由于项目需求,需要在三个ASPxComboBox控件实现联动查询,前一个控件的数据源决定后一个控件的数据源,并且后一个控件的选项会随前一个控件选中值的变化而变化。
我们先编写前台界面功能代码
<table>
<tr>
<td>部门:</td>
<td>
<dx:ASPxComboBox ID="cb_dept" runat="server" ValueType="System.String"
Width="120px">
<ClientSideEvents SelectedIndexChanged="function(s, e) {
main.PerformCallback(s.GetValue());
}" />
</dx:ASPxComboBox>
</td>
<td>
班组:
</td>
<td>
<dx:ASPxComboBox ID="Team" runat="server" ClientInstanceName="main" ValueType="System.String" OnCallback="Team_Callback">
<ClientSideEvents SelectedIndexChanged="function(s, e) {
son.PerformCallback(s.GetValue());
}" />
</dx:ASPxComboBox>
</td>
<td>岗位:</td>
<td>
<dx:ASPxComboBox ID="jobs" runat="server" ClientInstanceName="son" ValueType="System.String" OnCallback="jobs_Callback">
</dx:ASPxComboBox>
</td>
<td>
<dx:ASPxButton ID="ASPxButton1" runat="server" Text="查询" AutoPostBack="false">
<ClientSideEvents click="function(s,e){
grid.Refresh();
}
"/>
</dx:ASPxButton>
</td>
</tr>
</table>
s.GetValue()用于获取部门ASPxComboBox控件选中的值,main.PerformCallback(s.GetValue())则表示班组ASPxComboBox控件将s.GetValue()取到的值从客户端传递到服务端,而son.PerformCallback(s.GetValue())也是同理。
另外,两个子级控件都需要添加回调函数事件,否则无法实现联动查询。
编写完前台代码,现在我们开始写后台代码。
using DevExpress.Web.ASPxEditors;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Pro_EAM_SBWH_2_Code_2_Select : System.Web.UI.Page
{
Sys.APP_User currentUser = new Sys.APP_User();
Sys.OraDataBase data = new Sys.OraDataBase();
protected void Page_Load(object sender, EventArgs e)
{
currentUser = new Sys.APP_User(this.Context.User.Identity.Name);
if (!IsPostBack)
{
cb_dept_bind();
Team_bind(cb_dept.Value.ToString());
Team.SelectedIndex = 0;
jobs_bind(Team.Value.ToString());
jobs.SelectedIndex = 0;
}
}
/// <summary>
/// 部门下拉框绑定
/// </summary>
public void cb_dept_bind()
{
string sql = @"select
a.id,
a.name
from dept a
where a.status=0
order by nvl(a.attribute4, 9999), a.dept_name
";
DataSet ds=data.GetDataSet(sql);
cb_dept.Items.Clear();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
cb_dept.Items.Add(new ListEditItem(ds.Tables[0].Rows[i]["name"].ToString(), ds.Tables[0].Rows[i]["id"].ToString()));
}
cb_dept.Value = currentUser.dept_id;
}
/// <summary>
/// 班组下拉框绑定
/// </summary>
public void Team_bind(string dept_id)
{
string sql = @"select
Name,id
from team t,dept d
where t.status!=3 and t.dept_Id=d.dept_Id
and d.dept_Id='" + dept_id + "'";
DataSet ds = data.GetDataSet(sql);
Team.Items.Clear();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
Team.Items.Add(new ListEditItem(ds.Tables[0].Rows[i]["Name"].ToString(), ds.Tables[0].Rows[i]["ID"].ToString()));
}
}
/// <summary>
/// 岗位下拉框数据绑定
/// </summary>
private void jobs_bind( string team_id)
{
string sql = @"Select Name,ID
From Posts
where Team_Id='" + team_id + "'";
DataSet ds = data.GetDataSet(sql);
jobs.Items.Clear();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
jobs.Items.Add(new ListEditItem(ds.Tables[0].Rows[i]["Name"].ToString(),ds.Tables[0].Rows[i]["Id"].ToString()));
}
}
protected void jobs_Callback(object sender, DevExpress.Web.ASPxClasses.CallbackEventArgsBase e)
{
jobs_bind(e.Parameter);
}
protected void Team_Callback(object sender, DevExpress.Web.ASPxClasses.CallbackEventArgsBase e)
{
Team_bind(e.Parameter);
}
}
两个子级ASPxComboBox控件的绑定采用了带参方法,用于接收前台传递过来的参数,他们的查询语句的条件都是根据各自父级控件的选中值(即参数)来查询,再进行数据的动态绑定,而两个回调函数事件则将前台传递过来的值传递给相应的方法。
总结:多个ASPxComboBox控件之间的联动查询无非是各个ASPxComboBox控件数据的动态绑定,查询语句的条件需要父级ASPxComboBox控件选中值来动态改变。**这个本质就是前台传值给后台,后台事件再进行传参调用方法。**整个写下来可能会有点绕,但梳理一下便能明白其中的逻辑,希望能对各位有所帮助!