宜昌华友成品库管理软件
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

447 lines
16 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;
namespace SiaSun.LMS.WPFClient.UC
{
/// <summary>
/// ucQuery.xaml 的交互逻辑
/// </summary>
public partial class ucQuery : UserControl
{
IList<Model.SYS_ITEM_LIST> listCompareOp;
IList<Model.SYS_ITEM_LIST> listLogicOp;
string strTableName = null;
string windowName = null;
/// <summary>
/// 关联XML表名
/// </summary>
public string U_XmlTableName
{
get { return strTableName; }
set { strTableName = value; }
}
/// <summary>
/// 关联窗体名称
/// </summary>
public string U_WindowName
{
get { return windowName; }
set { windowName = value; }
}
public ucQuery()
{
InitializeComponent();
}
/// <summary>
/// 初始化控件
/// </summary>
public void U_InitControl()
{
try
{
//获得操作符号列表
this.listCompareOp = MainApp._I_SystemService.ITEM_LIST_GetList_ITEM_CODE("CompareOperation");
this.listLogicOp = MainApp._I_SystemService.ITEM_LIST_GetList_ITEM_CODE("LogicalOperation");
//添加查询控件
CustomerDescriptions cusDescription = new CustomerDescriptions();
using (DataTable tableFieldDescription = string.IsNullOrEmpty(windowName) ? cusDescription.GetStyleDataTable(strTableName) : cusDescription.GetFormStyleDataTable(windowName, strTableName))
{
//根据序号排序并添加列显示
DataRow[] arRowField = tableFieldDescription.Rows.Cast<DataRow>().ToArray<DataRow>();
var queryField = from row in arRowField orderby Convert.ToInt32(row["Order"].ToString()) select row;
//开始初始化
this.BeginInit();
//判断控件类型设置显示列样式
foreach (DataRow rowField in queryField)
{
if (!rowField.IsNull("Header") && !String.IsNullOrEmpty(rowField["Header"].ToString()))
{
//判断类型
switch (rowField["ControlType"].ToString().ToLower())
{
case "checkbox":
this.AddCheckBox(rowField);
break;
case "combobox":
this.AddComboBox(rowField);
break;
case "elementcombox":
this.AddElmentComboBox(rowField);
break;
case "datetimepicker":
this.AddDatePicker(rowField);
break;
default:
this.AddTextBox(rowField);
break;
}
}
}
//结束初始化
this.EndInit();
}
}
catch (Exception ex)
{
MainApp._MessageDialog.ShowException(ex);
}
}
#region ------添加查询控件
/// <summary>
/// 添加比较操作符号
/// </summary>
private void AddCompareOp(StackPanel panelItem)
{
ComboBox cmbOp = new ComboBox();
cmbOp.Width = 65;
cmbOp.Tag = "CompareOp";
cmbOp.Margin = new Thickness(1);
panelItem.Children.Add(cmbOp);
cmbOp.DisplayMemberPath = "ITEM_LIST_NAME";
cmbOp.SelectedValuePath = "ITEM_LIST_CODE";
cmbOp.ItemsSource = this.listCompareOp;
cmbOp.SelectedIndex = 0;
}
/// <summary>
/// 添加逻辑操作符号
/// </summary>
private void AddLogicOp(StackPanel panelItem)
{
ComboBox cmbOp = new ComboBox();
cmbOp.Width = 60;
cmbOp.Tag = "LogicOp";
cmbOp.Margin = new Thickness(1);
panelItem.Children.Add(cmbOp);
cmbOp.DisplayMemberPath = "ITEM_LIST_NAME";
cmbOp.SelectedValuePath = "ITEM_LIST_CODE";
cmbOp.ItemsSource = this.listLogicOp;
cmbOp.SelectedIndex = 0;
}
/// <summary>
/// 添加面板
/// </summary>
private StackPanel AddStackPanel(DataRow rowField)
{
//添加面板
StackPanel panelItem = new StackPanel();
panelItem.Tag = rowField;
panelItem.Margin = new Thickness(10,1,10,1);
panelItem.Orientation = Orientation.Horizontal;
this.panelQuery.Children.Add(panelItem);
//添加分割线
Separator spr = new Separator();
spr.Style = MainApp.GetStyleResource("styleDefaltSeparator") as Style;
spr.Height = 2;
spr.Margin = new Thickness(5, 1, 5, 1);
this.panelQuery.Children.Add(spr);
return panelItem;
}
/// <summary>
/// 添加标题
/// </summary>
private void AddHeader(StackPanel panelItem,string Header)
{
//显示标题
TextBlock txtHeader = new TextBlock();
txtHeader.Width = 100;
txtHeader.VerticalAlignment = System.Windows.VerticalAlignment.Center;
panelItem.Children.Add(txtHeader);
//绑定标题
txtHeader.Text = string.Format("{0}:",Header);
}
/// <summary>
/// 添加文本编辑
/// </summary>
private void AddTextBox(DataRow rowField)
{
//添加面板
StackPanel panelItem = this.AddStackPanel(rowField);
//显示标题
AddHeader(panelItem, rowField["Header"].ToString());
//添加操作符号
this.AddCompareOp(panelItem);
//添加内容控件
TextBox txtContent = new TextBox();
txtContent.Style = (Style)MainApp.GetStyleResource("styleDefaultTextBox");
txtContent.Width = 150;
txtContent.Tag = rowField;
txtContent.Margin = new Thickness(10, 2, 5, 2);
panelItem.Children.Add(txtContent);
//添加逻辑符号
this.AddLogicOp(panelItem);
}
/// <summary>
/// 添加日期编辑
/// </summary>
private void AddDatePicker(DataRow rowField)
{
//添加面板
StackPanel panelItem = this.AddStackPanel(rowField);
//显示标题
AddHeader(panelItem, rowField["Header"].ToString());
//添加操作符号
this.AddCompareOp(panelItem);
//添加内容控件
DatePicker dtPicker = new DatePicker();
dtPicker.Width = 150;
dtPicker.Tag = rowField;
dtPicker.Margin = new Thickness(10, 2, 5, 2);
panelItem.Children.Add(dtPicker);
//添加逻辑符号
this.AddLogicOp(panelItem);
}
/// <summary>
/// 添加选中框
/// </summary>
private void AddCheckBox(DataRow rowField)
{
//添加面板
StackPanel panelItem = this.AddStackPanel(rowField);
//显示标题
AddHeader(panelItem, rowField["Header"].ToString());
//添加操作符号
this.AddCompareOp(panelItem);
//控件定义
CheckBox chkBox = new CheckBox();
chkBox.VerticalAlignment = System.Windows.VerticalAlignment.Center;
chkBox.Width = 150;
chkBox.Tag = rowField;
chkBox.IsThreeState = false;
chkBox.Margin = new Thickness(10, 2, 5, 2);
panelItem.Children.Add(chkBox);
//添加逻辑符号
this.AddLogicOp(panelItem);
}
/// <summary>
/// 添加选中框
/// </summary>
private void AddComboBox(DataRow rowField)
{
//添加面板
StackPanel panelItem = this.AddStackPanel(rowField);
//显示标题
AddHeader(panelItem, rowField["Header"].ToString());
//添加操作符号
this.AddCompareOp(panelItem);
//设置内容控件
ComboBox cmb = new ComboBox();
cmb.Tag = rowField;
cmb.Width = 150;
cmb.Height = 21;
cmb.Margin = new Thickness(10, 2, 5, 2);
cmb.DisplayMemberPath = "NAME".ToLower();
cmb.SelectedValuePath = "VALUE".ToLower();
cmb.ItemsSource = new CustomerDescriptions().GetComboBoxDataTable(rowField["DataBind"].ToString()).DefaultView;
cmb.SelectedIndex = -1;
panelItem.Children.Add(cmb);
//添加逻辑符号
this.AddLogicOp(panelItem);
}
/// <summary>
/// 添加选中框
/// </summary>
private void AddElmentComboBox(DataRow rowField)
{
//添加面板
StackPanel panelItem = this.AddStackPanel(rowField);
//显示标题
AddHeader(panelItem, rowField["Header"].ToString());
//添加操作符号
this.AddCompareOp(panelItem);
//设置内容控件
ComboBox cmb = new ComboBox();
cmb.Width = 150;
cmb.Height = 21;
cmb.Tag = rowField;
cmb.Margin = new Thickness(10, 2, 5, 2);
panelItem.Children.Add(cmb);
if (!rowField.IsNull("DataBind"))
{
string[] arStr = rowField["DataBind"].ToString().Split('|');
cmb.ItemsSource = arStr;
}
cmb.SelectedIndex = -1;
//添加逻辑符号
this.AddLogicOp(panelItem);
}
#endregion
/// <summary>
/// 获得查询条件
/// </summary>
public string U_GetQueryWhere()
{
//查询对象集合
IList<SiaSun.LMS.Model.QueryObject> listQueryObject = new List<SiaSun.LMS.Model.QueryObject>();
foreach (FrameworkElement element in this.panelQuery.Children)
{
StackPanel panelItem = element as StackPanel;
if (panelItem != null)
{
DataRow rowField = element.Tag as DataRow;
if (rowField != null)
{
string strColumn = rowField["Column"].ToString();
string strControlType = rowField["ControlType"].ToString().TrimEnd();
string strCompareOperation = (panelItem.Children[1] as ComboBox).SelectedValue.ToString();
string strLogicalOperation = (panelItem.Children[3] as ComboBox).SelectedValue.ToString();
string strValue = string.Empty;
//判断输入控件的控件类型
if (panelItem.Children[2] is CheckBox)
{
CheckBox chkBox = panelItem.Children[2] as CheckBox;
strValue = Convert.ToInt32(chkBox.IsChecked).ToString();
listQueryObject.Add(GetQueryObject(strColumn, strCompareOperation, strValue, strLogicalOperation));
}
else if (panelItem.Children[2] is DatePicker)
{
DatePicker dtPicker = panelItem.Children[2] as DatePicker;
if (dtPicker.SelectedDate != null || (strCompareOperation.Contains("NULL")) || (strCompareOperation.Contains("LIKE")))
{
strValue = Convert.ToDateTime(dtPicker.SelectedDate).ToString("yyyy-MM-dd");
listQueryObject.Add(GetQueryObject(strColumn, strCompareOperation, strValue, strLogicalOperation));
}
}
else if (panelItem.Children[2] is ComboBox)
{
ComboBox cmb = panelItem.Children[2] as ComboBox;
if (cmb.SelectedValue != null || (strCompareOperation.Contains("NULL")) || (strCompareOperation.Contains("LIKE")))
{
strValue = cmb.SelectedValue.ToString();
listQueryObject.Add(GetQueryObject(strColumn, strCompareOperation, strValue, strLogicalOperation));
}
}
else if(panelItem.Children[2] is TextBox)
{
TextBox txt = panelItem.Children[2] as TextBox;
if (!string.IsNullOrEmpty(txt.Text) || (strCompareOperation.Contains("NULL")) || (strCompareOperation.Contains("LIKE")))
{
strValue = txt.Text;
listQueryObject.Add(GetQueryObject(strColumn, strCompareOperation, strValue, strLogicalOperation));
}
}
}
}
}
return GetWhere(listQueryObject);
}
/// <summary>
/// 获得查询对象
/// </summary>
private SiaSun.LMS.Model.QueryObject GetQueryObject(string Column, string Operation, string Value, string Logic)
{
SiaSun.LMS.Model.QueryObject queryObj = new SiaSun.LMS.Model.QueryObject();
queryObj.Column = Column;
queryObj.Operation = Operation;
queryObj.Value = Value;
queryObj.Logic = Logic;
return queryObj;
}
/// <summary>
/// 获得条件
/// </summary>
private string GetWhere(IList<SiaSun.LMS.Model.QueryObject> QueryObjectList)
{
StringBuilder strbWhere = new StringBuilder();
for (int i = 0; i < QueryObjectList.Count; i++)
{
SiaSun.LMS.Model.QueryObject queryObj = QueryObjectList[i];
string Column = queryObj.Column;
string Operation = queryObj.Operation;
string Value = queryObj.Value;
string Logic = (i == (QueryObjectList.Count - 1)) ? string.Empty : queryObj.Logic;
//判断查询操作符号
switch (queryObj.Operation.ToUpper())
{
case "LIKE":
case "NOT LIKE":
strbWhere.Append(string.Format(" ({0} {1} '%{2}%') {3} ", Column, Operation, Value, Logic));
break;
case "IS NULL":
case "IS NOT NULL":
strbWhere.Append(string.Format(" ({0} {1}) {2} ", Column, Operation, Logic));
break;
case "NVL":
strbWhere.Append(string.Format("({0}({1},{2})='{2}') {3}", Operation, Column, Value, Logic));
break;
case "BETWEEN":
string[] arStrFromTo = Value.Split('-');
if (arStrFromTo.Length == 2)
{
strbWhere.Append(string.Format("({0} {1} '{2}' AND '{3}') {4}", Column, Operation, arStrFromTo[0], arStrFromTo[1], Logic));
}
break;
default:
strbWhere.Append(string.Format(" ({0}{1}'{2}') {3} ", Column, Operation, Value, Logic));
break;
}
}
return strbWhere.ToString();
}
}
}