#region using System; using System.Collections.Generic; using System.Data; using System.Text; using System.Windows.Forms; using CSFrameworkV5.Business; using CSFrameworkV5.Common; using CSFrameworkV5.Core; using CSFrameworkV5.Interfaces; using CSFrameworkV5.Interfaces.InterfaceModels; using DevExpress.XtraBars; #endregion namespace CSFrameworkV5.Library { public partial class frmAdvancedFilter : Form { //通用查询接口 private IAdvancedSearcher _advancedSearcher; //当前操作的配置 private MyConfigData _Current; private BarButtonItem btnViewLarge; private BarButtonItem btnViewList; private BarButtonItem btnViewListDetail; private BarButtonItem btnViewSmall; /// /// 私有构造器 /// private frmAdvancedFilter() { InitializeComponent(); } private void btmToLeft_Click(object sender, EventArgs e) { if (listSelectedFields.SelectedItem == null) return; var item = listSelectedFields.SelectedItem as FieldNameDef; var source = listSelectedFields.DataSource as List; var target = listFields.DataSource as List; target.Add(item); source.Remove(item); listSelectedFields.Refresh(); listFields.Refresh(); } private void btnAdd_Click(object sender, EventArgs e) { if (txtFieldList.Text == "" || txtOperator.Text == "") { Msg.Warning("必须选择字段及操作符!"); return; } if (txtSQL.Text.Trim().Length > 3 && txtLogicOption.EditValue == null) { Msg.Warning("请选择条件关系!"); return; } var op = txtOperator.EditValue.ToStringEx(); var item = txtFieldList.GetSelectedDataRow() as FieldNameDef; var condition = ""; var alias = string.IsNullOrEmpty(_advancedSearcher.TableAliasName) ? "" : _advancedSearcher.TableAliasName + "."; if (op == "LIKE") { if (item.IsStringType()) //LIKE 关键字仅支持字符类型 condition = "(" + alias + item.FieldName + " " + op + " '%" + txtValue.Text + "%')"; } else { if (item.IsStringType()) //字符类型,值要加单引号 condition = "(" + alias + item.FieldName + " " + op + " '" + txtValue.Text + "')"; else condition = "(" + alias + item.FieldName + " " + op + txtValue.Text + ")"; } if (txtSQL.Text.Trim() == "") txtSQL.Text = condition; else txtSQL.Text = txtSQL.Text + "\r\n " + txtLogicOption.EditValue.ToStringEx() + " " + condition; txtFieldList.EditValue = null; txtValue.Text = ""; } private void btnCancel_Click(object sender, EventArgs e) { Close(); } private void btnClearEditor_Click(object sender, EventArgs e) { if (Msg.AskQuestion("确定要清除吗?")) ClearEditor(); } private void btnDelete_Click(object sender, EventArgs e) { if (lvConfig.SelectedItems.Count <= 0) return; var configName = (lvConfig.SelectedItems[0].Tag as MyConfigData).Name; if (Msg.AskQuestion("确定要删除 " + configName + " 的配置信息吗?")) { //数据库删除 var ok = AdvancedFilterTools.Delete(Loginer.CurrentUser.Account, configName); if (ok) { //删除列表项目 lvConfig.Items.Remove(lvConfig.SelectedItems[0]); ClearEditor(); //预算为所有可选字段 listFields.DataSource = _advancedSearcher.GetFieldList(); listSelectedFields.DataSource = new List(); listFields.Refresh(); listSelectedFields.Refresh(); _Current = null; lblCurrentStyle.Text = "请打开方案!"; Msg.ShowInformation("删除成功!"); } else { Msg.Warning("删除失败!"); } } } private void btnOK_Click(object sender, EventArgs e) { //一般选项 if (xtraTabControl1.SelectedTabPage == xtraTabPage1) { if (!ValidateData()) return; _advancedSearcher.WhereSQL = GenerateSqlWhere(); //生成SQL.Where条件 _advancedSearcher.TopRows = ConvertEx.ToInt(txtRows.EditValue); //记录数 btnOK.Tag = "OK"; Close(); } else //高级设置 { var sb = new StringBuilder(" ORDER BY "); var list = listSelectedFields.DataSource as List; foreach (var F in list) if (list.IndexOf(F) == 0) sb.Append(" " + F.FieldName + " " + (F.OrderBy == 1 ? "ASC" : "DESC")); else sb.Append("," + F.FieldName + " " + (F.OrderBy == 1 ? "ASC" : "DESC")); _advancedSearcher.WhereSQL = txtSQL.Text + "\r\n" + sb.ToStringEx(); _advancedSearcher.TopRows = int.Parse(txtRows.Text); //记录数 btnOK.Tag = "OK"; Close(); } } private void btnOpen_Click(object sender, EventArgs e) { if (lvConfig.SelectedItems.Count <= 0) { Msg.Warning("请选择一个方案!"); return; } var item = lvConfig.SelectedItems[0]; _Current = item.Tag as MyConfigData; lblCurrentStyle.Text = "当前方案:" + _Current.Name; txtSQL.Text = _Current.SQL; listFields.DataSource = CopyObject(_Current.AllFields); listSelectedFields.DataSource = CopyObject(_Current.AllSelectedFields); //高级设置 xtraTabControl1.SelectedTabPage = xtraTabPage2; } private void btnSave_Click(object sender, EventArgs e) { if (txtSQL.Text.Trim() == "") { Msg.Warning("您没有配置任何条件!"); return; } //输入名字 var name = frmAdvancedFilterDlg.Execute(); if (string.IsNullOrEmpty(name)) return; //DB检查是否存在 if (AdvancedFilterTools.Exists(Loginer.CurrentUser.Account, name)) { Msg.Warning("方案名称重复,不能保存!"); return; } //构建数据实例 var data = new MyConfigData(); data.BusinessName = _advancedSearcher.BusinessName; data.CreateDate = DateTime.Now; data.Name = name; data.SQL = txtSQL.Text; data.AllFields = CopyObject(listFields.DataSource as List); data.AllSelectedFields = CopyObject(listSelectedFields.DataSource as List); data.UserID = Loginer.CurrentUser.Account; //DB保存数据 var ok = AdvancedFilterTools.Post(data); if (ok) { //在列表内添加一条记录 var item = lvConfig.Items.Add(data.Name, 0); item.SubItems.Add(data.CreateDate.ToStringEx()); item.Tag = data; //设置当前对象 lvConfig.FocusedItem = item; lvConfig.Focus(); _Current = data; lblCurrentStyle.Text = "当前方案:" + _Current.Name; Msg.ShowInformation("保存成功!"); } } private void btnToRight_Click(object sender, EventArgs e) { if (listFields.SelectedItem == null) return; var item = listFields.SelectedItem as FieldNameDef; var source = listFields.DataSource as List; var target = listSelectedFields.DataSource as List; item.OrderBy = 1; target.Add(item); source.Remove(item); listSelectedFields.Refresh(); listFields.Refresh(); } private void BtnViewLarge_ItemClick(object sender, ItemClickEventArgs e) { if (e.Item == btnViewLarge) LoadListViewDataSource(View.LargeIcon); if (e.Item == btnViewSmall) LoadListViewDataSource(View.SmallIcon); if (e.Item == btnViewList) LoadListViewDataSource(View.List); if (e.Item == btnViewListDetail) LoadListViewDataSource(View.Details); } private void ClearEditor() { txtFieldList.EditValue = null; txtOperator.EditValue = null; txtLogicOption.EditValue = null; txtValue.EditValue = ""; txtSQL.EditValue = ""; } private List CopyObject(List source) { var result = new List(); foreach (var o in source) result.Add(o.Copy()); return result; } /// /// 加载逻辑运算符数据源 /// /// private DataTable CreateLogicOperatorData() { var dt = new DataTable(); dt.Columns.Add("ID", typeof(string)); dt.Columns.Add("NAME", typeof(string)); dt.Rows.Add("", ""); dt.Rows.Add("AND", "并且"); dt.Rows.Add("OR", "或者"); return dt; } /// /// 加载运算符数据源 /// /// private DataTable CreateOperatorData() { var dt = new DataTable(); dt.Columns.Add("ID", typeof(string)); dt.Columns.Add("NAME", typeof(string)); dt.Rows.Add("=", "等于"); dt.Rows.Add(">", "大于"); dt.Rows.Add("<", "小于"); dt.Rows.Add(">=", "大于或等于"); dt.Rows.Add("<=", "小于或等于"); dt.Rows.Add("<>", "不等于"); dt.Rows.Add("LIKE", "包含"); return dt; } /// /// 外部调用通用接口 /// /// public static bool Execute(IAdvancedSearcher advancedSearcher) { var form = new frmAdvancedFilter(); form.InitUI(advancedSearcher); form.ShowDialog(); return form.btnOK.Tag != null; } private void frmAdvancedFilter_Load(object sender, EventArgs e) { LoadListButton(); LoadListViewDataSource(View.LargeIcon); } private string GenerateSqlWhere() { var sb = new StringBuilder(); var data = (List)gcWhere.DataSource; var condition = ""; var alias = string.IsNullOrEmpty(_advancedSearcher.TableAliasName) ? "" : _advancedSearcher.TableAliasName + "."; ItemConfig item; for (var i = 0; i <= data.Count - 1; i++) { item = data[i]; if (item.Operator == "") continue; //无操作符,不生成SQL condition = ""; if (item.Operator == "LIKE") { if (item.IsStringType) //LIKE 关键字仅支持字符类型 condition = "(" + alias + item.FieldName + " " + item.Operator + " '%" + item.Value + "%')"; } else { if (item.IsStringType) //字符类型,值要加单引号 condition = "(" + alias + item.FieldName + " " + item.Operator + " '" + item.Value + "')"; else condition = "(" + alias + item.FieldName + " " + item.Operator + item.Value + ")"; } if (condition.Trim() != "") { //添加逻辑运算符,最后一项除外 if (i > 0 && sb.Length > 0) sb.Append(" " + item.LogicOperator + " "); sb.Append(condition); } } return sb.ToStringEx(); } private void InitUI(IAdvancedSearcher advancedSearcher) { _advancedSearcher = advancedSearcher; //选择框:返回的记录数 txtRows.Properties.Items.Clear(); txtRows.Properties.Items.AddRange(new object[] { 50, 100, 200, 300, 500 }); txtRows.EditValue = 200; //预设值 //表格的Lookup选择组件 lueLogic.DisplayMember = "NAME"; lueLogic.ValueMember = "ID"; lueLogic.DataSource = CreateLogicOperatorData(); lueOperator.DisplayMember = "NAME"; lueOperator.ValueMember = "ID"; lueOperator.DataSource = CreateOperatorData(); //界面的Lookup选择组件 txtFieldList.Properties.DataSource = _advancedSearcher.GetFieldList(); txtFieldList.Properties.DisplayMember = "Caption"; txtFieldList.Properties.ValueMember = "FieldName"; txtOperator.Properties.DataSource = CreateOperatorData(); txtOperator.Properties.DisplayMember = "NAME"; txtOperator.Properties.ValueMember = "ID"; //全部用于排序字段列表 listFields.DataSource = _advancedSearcher.GetFieldList(); listFields.DisplayMember = "Caption"; listFields.ValueMember = "FieldName"; //选择的排序字段列表 listSelectedFields.DataSource = new List(); listSelectedFields.DisplayMember = "Caption"; listSelectedFields.ValueMember = "FieldName"; //加载业务功能对应的条件数据源 var data = new List(); var list = _advancedSearcher.GetFieldList(); foreach (var F in list) { var T = new ItemConfig(F); T.LogicOperator = "AND"; //预算逻辑运算符 data.Add(T); } gcWhere.DataSource = data; } private void listFields_DoubleClick(object sender, EventArgs e) { //左到右 if (listFields.SelectedItem != null) btnToRight_Click(btnToRight, new EventArgs()); } private void listSelectedFields_Click(object sender, EventArgs e) { if (listSelectedFields.SelectedItem == null) return; var item = listSelectedFields.SelectedItem as FieldNameDef; if (item.OrderBy == 1) item.OrderBy = 2; else item.OrderBy = 1; listSelectedFields.Refresh(); } private void listSelectedFields_DoubleClick(object sender, EventArgs e) { //右到左 if (listSelectedFields.SelectedItem != null) btmToLeft_Click(btmToLeft, new EventArgs()); } private void LoadListButton() { btnViewLarge = new BarButtonItem(); btnViewSmall = new BarButtonItem(); btnViewList = new BarButtonItem(); btnViewListDetail = new BarButtonItem(); // // barButtonItem1 // btnViewLarge.Caption = "大型图标"; btnViewLarge.Id = 0; btnViewLarge.Name = "barButtonItem1"; btnViewLarge.ImageIndex = 0; btnViewLarge.ItemClick += BtnViewLarge_ItemClick; // // barButtonItem2 // btnViewSmall.Caption = "小型图标"; btnViewSmall.Id = 1; btnViewSmall.Name = "barButtonItem2"; btnViewSmall.ImageIndex = 1; btnViewSmall.ItemClick += BtnViewLarge_ItemClick; // // barButtonItem3 // btnViewList.Caption = "清单"; btnViewList.Id = 2; btnViewList.Name = "barButtonItem3"; btnViewList.ImageIndex = 2; btnViewList.ItemClick += BtnViewLarge_ItemClick; // // barButtonItem4 // btnViewListDetail.Caption = "详细资料"; btnViewListDetail.Id = 3; btnViewListDetail.Name = "barButtonItem4"; btnViewListDetail.ImageIndex = 3; btnViewListDetail.ItemClick += BtnViewLarge_ItemClick; popupMenu1.LinksPersistInfo.AddRange(new[] { new LinkPersistInfo(btnViewLarge), new LinkPersistInfo(btnViewSmall), new LinkPersistInfo(btnViewList), new LinkPersistInfo(btnViewListDetail) }); barManager1.Items.AddRange(new BarItem[] { btnViewLarge, btnViewSmall, btnViewList, btnViewListDetail }); } private void LoadListViewDataSource(View viewStyle) { // 获取我的配置 var list = AdvancedFilterTools.GetConfig(Loginer.CurrentUser.Account); lvConfig.Items.Clear(); lvConfig.Columns.Clear(); lvConfig.Columns.Add("名称", 100); lvConfig.Columns.Add("日期", 200); foreach (var R in list) { var item = lvConfig.Items.Add(R.Name, 0); item.SubItems.Add(R.CreateDate.ToStringEx()); item.Tag = R; } lvConfig.View = viewStyle; } /// /// 校验数据 /// /// private bool ValidateData() { var data = (List)gcWhere.DataSource; for (var i = 0; i <= data.Count - 1; i++) { //检查操作符 if (data[i].Operator == "" && data[i].Value.Length > 0) { MessageBox.Show("请选择【操作符】!"); gvWhere.FocusedRowHandle = i; return false; } data[i].IsValid = data[i].Operator != "" && data[i].Value.Length > 0; //检查逻辑运算符 if (i > 0 && data[i].IsValid && data[i - 1].IsValid && data[i - 1].LogicOperator == "") { MessageBox.Show("配置复合查询条件,必须选择【逻辑符】!"); gvWhere.FocusedRowHandle = i - 1; return false; } } return true; } } }