#region using System; using System.Collections.Generic; using System.Data; using System.Windows.Forms; using CSFrameworkV5.Business; using CSFrameworkV5.Common; using CSFrameworkV5.Core; using CSFrameworkV5.Interfaces; using DevExpress.XtraEditors; using DevExpress.XtraGrid.Columns; using DevExpress.XtraGrid.Views.Grid; #endregion namespace CSFrameworkV5.Library.CommonForms { public partial class frmAdvancedSearch : frmBase { //支持高级搜索的接口 private ISupportAdvancedSearch _BLL; private string _CombinedSQL = string.Empty; private GridView _OutputView; private Control _ValueControl1; private Control _ValueControl2; private frmAdvancedSearch() { InitializeComponent(); _ValueControl1 = txtValue; _ValueControl2 = txtValue1; } private void btnCancel_Click(object sender, EventArgs e) { Close(); } private void btnSearch_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(cbFields.Text) && string.IsNullOrEmpty(cbFields1.Text)) { Msg.Warning("没有指定查询字段!"); return; } if (_BLL != null) { try { frmWaitingEx.ShowMe(this); if (_BLL.ResultType == AdvancedSearchResult.WhereSQL) { var where = GetCombinedSQL(); //组合查询条件 var result = _BLL.AdvancedSearch(where); _OutputView.GridControl.DataSource = result; } if (_BLL.ResultType == AdvancedSearchResult.DbParamList) { string whereSQL; //组合where条件, 如:where Code=@Code var paramList = GetDbParameterList(out whereSQL); //组合查询条件 var result = _BLL.AdvancedSearch(whereSQL, paramList); _OutputView.GridControl.DataSource = result; } } catch (Exception ex) { LogDB.Log.WriteLog(LogTypeSystem.Exception, ex.Message, GetType().Name, "高级查询", ""); } finally { frmWaitingEx.HideMe(this); } Msg.ShowInformation("查询成功,共找到 " + _OutputView.RowCount.ToStringEx() + " 条记录!"); //this.Close(); } else { Msg.Warning("未指查询的业务对象(BLL)!"); } } private bool CheckNum(Control editor) { decimal ret = 0; if (!decimal.TryParse(editor.Text, out ret)) { Msg.Warning("无效的数字!"); editor.Focus(); return false; } return true; } /// /// 打开高级查询窗体. 参数gridView用于列出所有显示字段. objType:为搜索的对象类型. /// public static string Execute(GridView gridView, ISupportAdvancedSearch BLL) { var form = new frmAdvancedSearch(); form._BLL = BLL; form.InitWindow(gridView); form.ShowDialog(); return form._CombinedSQL; } public static string Execute(GridView summaryView, GridView detailView, ISupportAdvancedSearch BLL) { var form = new frmAdvancedSearch(); form._BLL = BLL; form.InitWindow(summaryView, detailView); form.ShowDialog(); return form._CombinedSQL; } private void frmAdvSearch_Load(object sender, EventArgs e) { if (cbFields.Properties.Items.Count > 0) cbFields.SelectedIndex = 0; } /// /// 组合Where查询条件 /// /// private string GetCombinedSQL() { _CombinedSQL = " ({0}{1}{2}) "; var sql = " (1=1) "; var sql1 = " (1=1) "; var logicOperator = " AND "; if (rbOr.Checked) logicOperator = " OR "; var item1 = (ItemObject)cbFields.SelectedItem; if (item1 != null) { var type1 = (Type)item1.Tag; if (IsNum(type1)) if (!CheckNum(_ValueControl1)) return ""; sql = GetSQL((ItemObject)cbFields.SelectedItem, 0); } var item2 = (ItemObject)cbFields1.SelectedItem; if (item2 != null) { var type2 = (Type)item2.Tag; if (IsNum(type2)) if (!CheckNum(_ValueControl2)) return ""; sql1 = GetSQL((ItemObject)cbFields1.SelectedItem, 1); } _CombinedSQL = string.Format(_CombinedSQL, sql, logicOperator, sql1); return _CombinedSQL; } private DbParameterModel[] GetDbParameterList(out string whereSQL) { var list = new List(); whereSQL = ""; var sql = " (1=1) "; var logicOperator = " AND "; if (rbOr.Checked) logicOperator = " OR "; var paramValue = ""; var paramName = ""; var item1 = (ItemObject)cbFields.SelectedItem; if (item1 != null) { var type1 = (Type)item1.Tag; if (IsNum(type1)) if (!CheckNum(_ValueControl1)) return list.ToArray(); sql = GetSqlDbParameter((ItemObject)cbFields.SelectedItem, 0, out paramName, out paramValue); list.Add(new DbParameterModel { ParamName = paramName, ParamValue = paramValue }); whereSQL = sql; } var item2 = (ItemObject)cbFields1.SelectedItem; if (item2 != null) { var type2 = (Type)item2.Tag; if (IsNum(type2)) if (!CheckNum(_ValueControl2)) return list.ToArray(); sql = GetSqlDbParameter((ItemObject)cbFields1.SelectedItem, 1, out paramName, out paramValue); list.Add(new DbParameterModel { ParamName = paramName, ParamValue = paramValue }); whereSQL = whereSQL + logicOperator + sql; } whereSQL = " (" + whereSQL + ") "; return list.ToArray(); } private string GetOperator(int index) { ItemObject item = null; if (index == 0) item = (ItemObject)cbOperator.SelectedItem; if (index == 1) item = (ItemObject)cbOperator1.SelectedItem; if (item != null) return item.Value.ToStringEx(); return string.Empty; } private string GetSQL(ItemObject item, int index) { var operate = GetOperator(index); var value = ""; var type = (Type)item.Tag; if (index == 0) value = _ValueControl1.Text; else if (index == 1) value = _ValueControl2.Text; //防止SQL注入 value = Globals.RemoveInjection(value.ToStringEx()); var sql = " (1=1) "; //处理日期类型 if (type == typeof(DateTime) && value.ToStringEx().Trim() != string.Empty) { sql = "{0} {1} '{2}'"; if (item is FieldItem) sql = string.Format(sql, ((FieldItem)item).TableAlias + item.Value, operate, ConvertEx.ToCharYYYY_MM_DD_HHMMSS( DateTime.Parse(value.ToStringEx()))); else sql = string.Format(sql, item.Value, operate, ConvertEx.ToCharYYYY_MM_DD_HHMMSS( DateTime.Parse(value.ToStringEx()))); } //处理字符类型 else if (type == typeof(string) || type == typeof(char)) { if (operate == "like") { if (item is FieldItem) sql = string.Format("({0} {1} '%{2}%')", ((FieldItem)item).TableAlias + item.Value, operate, value); else sql = string.Format("({0} {1} '%{2}%')", item.Value, operate, value); } else { if (item is FieldItem) sql = string.Format("({0} {1} '{2}')", ((FieldItem)item).TableAlias + item.Value, operate, value); else sql = string.Format("({0} {1} '{2}')", item.Value, operate, value); } } //处理数字类型 else if (IsNum(type)) { if (item is FieldItem) sql = string.Format(" {0}{1}{2}", ((FieldItem)item).TableAlias + item.Value, operate, value.ToStringEx()); else sql = string.Format(" {0}{1}{2}", item.Value, operate, value.ToStringEx()); } return sql; } /// /// /// /// /// 返回DbParameter参数的值 /// 返回SQL, 如: Code=#P#Code private string GetSqlDbParameter(ItemObject item, int index, out string paramName, out string value) { value = ""; var operate = GetOperator(index); var type = (Type)item.Tag; if (index == 0) value = _ValueControl1.Text; else if (index == 1) value = _ValueControl2.Text; //防止SQL注入, 用户输入的查询条件值 value = Globals.RemoveInjection(value.ToStringEx()); var sql = " (1=1) "; paramName = DbParameterModel.ParamSymbol + item.Value .ToStringEx(); //如:#P#FieldName, #P#用于DAL层替换参数符号为@FieldName //处理日期类型 if (type == typeof(DateTime) && value.ToStringEx().Trim() != string.Empty) { sql = "{0} {1} {2}"; if (item is FieldItem) sql = string.Format(sql, ((FieldItem)item).TableAlias + item.Value, operate, paramName); else sql = string.Format(sql, item.Value, operate, paramName); } //处理字符类型 else if (type == typeof(string) || type == typeof(char)) { if (operate == "like") { value = $"%{value}%"; if (item is FieldItem) sql = string.Format("{0} {1} {2}", ((FieldItem)item).TableAlias + item.Value, operate, paramName); else sql = string.Format("{0} {1} {2}", item.Value, operate, paramName); } else { if (item is FieldItem) sql = string.Format("{0} {1} {2}", ((FieldItem)item).TableAlias + item.Value, operate, paramName); else sql = string.Format("{0} {1} {2}", item.Value, operate, paramName); } } //处理数字类型 else if (IsNum(type)) { if (item is FieldItem) sql = string.Format(" {0}{1}{2}", ((FieldItem)item).TableAlias + item.Value, operate, paramName); else sql = string.Format(" {0}{1}{2}", item.Value, operate, paramName); } return sql; } private void InitWindow(GridView gridView) { _CombinedSQL = string.Empty; _OutputView = gridView; var dataSource = gridView.GridControl.DataSource; if (dataSource == null) dataSource = _BLL.AdvancedSearch("1=0", null) as DataTable; if (dataSource is DataTable) { ItemObject item = null; foreach (GridColumn col in gridView.Columns) { item = new ItemObject(col.Caption, col.FieldName); item.Tag = (dataSource as DataTable).Columns[col.FieldName] .DataType; cbFields.Properties.Items.Add(item); cbFields1.Properties.Items.Add(item); } cbFields.Properties.Items.Insert(0, new ItemObject("", "")); cbFields1.Properties.Items.Insert(0, new ItemObject("", "")); } } private void InitWindow(GridView summaryView, GridView detailView) { _OutputView = summaryView; var master = summaryView.GridControl.DataSource; var detail = summaryView.GridControl.DataSource; if (master is DataTable && detail is DataTable == false) return; _CombinedSQL = string.Empty; FieldItem item = null; foreach (GridColumn col in summaryView.Columns) { item = new FieldItem(col.Caption, col.FieldName); item.Tag = (master as DataTable).Columns[col.FieldName] .DataType; item.TableAlias = "a."; //主表别名 cbFields.Properties.Items.Add(item); cbFields1.Properties.Items.Add(item); } foreach (GridColumn col in detailView.Columns) { item = new FieldItem(col.Caption, col.FieldName); item.Tag = (detail as DataTable).Columns[col.FieldName] .DataType; item.TableAlias = "b."; //明细表别名 cbFields.Properties.Items.Add(item); cbFields1.Properties.Items.Add(item); } cbFields.Properties.Items.Insert(0, new ItemObject("", "")); cbFields1.Properties.Items.Insert(0, new ItemObject("", "")); } private bool IsNum(Type type) { if (type == typeof(int) || type == typeof(float) || type == typeof(decimal) || type == typeof(float) || type == typeof(double) || type == typeof(int)) return true; return false; } private void LoadOperators(bool allowLike, int index) { if (index == 0) { cbOperator.Properties.Items.Clear(); if (cbFields.Text.Trim() != string.Empty) { cbOperator.Properties.Items.Add(new ItemObject("等于=", "=")); cbOperator.Properties.Items.Add( new ItemObject("大于等于>=", ">=")); cbOperator.Properties.Items.Add( new ItemObject("小于等于<=", "<=")); cbOperator.Properties.Items.Add( new ItemObject("不等于<>", "<>")); if (allowLike) cbOperator.Properties.Items.Add( new ItemObject("匹配字符like", "like")); cbOperator.SelectedIndex = 0; } } if (index == 1) { cbOperator1.Properties.Items.Clear(); if (cbFields1.Text.Trim() != string.Empty) { cbOperator1.Properties.Items.Add( new ItemObject("等于=", "=")); cbOperator1.Properties.Items.Add( new ItemObject("大于等于>=", ">=")); cbOperator1.Properties.Items.Add( new ItemObject("小于等于<=", "<=")); cbOperator1.Properties.Items.Add( new ItemObject("不等于<>", "<>")); if (allowLike) cbOperator1.Properties.Items.Add( new ItemObject("匹配字符like", "like")); cbOperator1.SelectedIndex = 0; } } } private void OnSelectedIndexChanged(object sender, EventArgs e) { //cbOperator var index = 0; var combo = (ComboBoxEdit)sender; if (combo == cbFields1) index = 1; var item = (ItemObject)combo.SelectedItem; if (item != null) { var type = (Type)item.Tag; var field = item.Value.ToStringEx().Trim(); if (type == typeof(DateTime)) { if (index == 0) SetValueEditor(txtDate, index); if (index == 1) SetValueEditor(txtDate1, index); LoadOperators(false, index); } else if (type == typeof(string) || type == typeof(char)) { Control valueControl = null; if (field.ToUpper().IndexOf("FLAG") == 0) { if (index == 0) valueControl = txtFlag; else valueControl = txtFlag1; } else { if (index == 0) valueControl = txtValue; else valueControl = txtValue1; } SetValueEditor(valueControl, index); LoadOperators(true, index); } else if (IsNum(type)) { if (index == 0) SetValueEditor(txtValue, index); if (index == 1) SetValueEditor(txtValue1, index); LoadOperators(false, index); } else { pbAlarm.Visible = true; } } if (index == 0) if (txtValue.CanFocus) txtValue.Focus(); if (index == 1) if (txtValue1.CanFocus) txtValue1.Focus(); } private void SetValueEditor(Control editor, int index) { foreach (Control ctl in Controls) { if (ctl.Tag == null) continue; if (ctl.Tag.ToStringEx() != "100") continue; if (ctl != _ValueControl1 && ctl != _ValueControl2) ctl.Visible = false; } if (index == 0) { _ValueControl1.Visible = false; _ValueControl1 = editor; _ValueControl1.Location = txtValue.Location; _ValueControl1.Width = txtValue.Width; _ValueControl1.Visible = true; } else if (index == 1) { _ValueControl2.Visible = false; _ValueControl2 = editor; _ValueControl2.Location = txtValue1.Location; _ValueControl2.Width = txtValue1.Width; _ValueControl2.Visible = true; } pbAlarm.Visible = false; lbAlarm.Visible = false; } //自定义对象 private class FieldItem : ItemObject { private string _TableAlias; public FieldItem(string keyName, object value) : base(keyName, value) { _Tag = null; } public string TableAlias { get => _TableAlias; set => _TableAlias = value; } } } }