Files
lserp_cs_5.0/插件库/ControlLib/inh/AutoSearcher.cs
T
2026-07-10 15:25:05 +08:00

1366 lines
53 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
using System.Drawing.Design;
using System.Windows.Forms.Design;
using System.Threading;
using System.Drawing;
using CommonLib;
using System.Text.RegularExpressions;
namespace ControlLib.inh
{
#region AutoSearcherEditor
/// <summary>
/// 属性编辑器
/// </summary>
public class AutoSearcherEditor : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
if (context != null && context.Instance != null)
{
return UITypeEditorEditStyle.Modal;
}
return base.GetEditStyle(context);
}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
IWindowsFormsEditorService editorService = null;
if (context != null && context.Instance != null && provider != null)
{
editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (editorService != null && context.Instance != null)
{
//取出设计器所在的窗体(组件/控件所在窗体)
//IDesignerHost host = (IDesignerHost)provider.GetService(typeof(IDesignerHost));
//if (host == null) return value;
//context.Instance:可以得到当前的Component组件。
AutoSearcher control = (AutoSearcher)context.Instance;
SearcherPropertyCollector spc = control.searcherPropertyCollector;
if (spc == null)
{
spc = new SearcherPropertyCollector();
spc.FieldPropertyList = new TFieldPropertyData[0];
}
inh.autosearcher_Res.FrmPropertySet dlg = new inh.autosearcher_Res.FrmPropertySet(spc);
if (editorService.ShowDialog(dlg) == DialogResult.OK)
{
spc = dlg.searcherPropertyCollector;
}
dlg.Dispose();
//重新序列化内容到.Designer.cs文件
context.PropertyDescriptor.SetValue(context.Instance, value);
//context.PropertyDescriptor.SetValue(context.Instance, value);
return spc;
}
}
return value;
}
}
#endregion
/// <summary>
/// 收缩匹配模式
/// </summary>
public enum TSearchMatchWay
{
swFuzzy = 0, //全模糊匹配
swLeftFuzzy = 1, //左边模糊匹配
swRightFuzzy = 2, //右边模糊匹配
swFullEqual = 3//相等
}
#region TFieldPropertyData
/// <summary>
/// 字段属性结构
/// </summary>
public class TFieldPropertyData
{
/// <summary>
/// 字段描述
/// </summary>
private string FFieldCaption = "";
public string FieldCaption
{
get { return FFieldCaption; }
set { FFieldCaption = value; }
}
/// <summary>
/// 字段在listview中显示的宽度
/// </summary>
private int FFieldWidth = 0;
public int FieldWidth
{
get { return FFieldWidth; }
set { FFieldWidth = value; }
}
/// <summary>
/// 字段名称
/// </summary>
private string FFieldName = "";
public string FieldName
{
get { return FFieldName; }
set { FFieldName = value; }
}
/// <summary>
/// 是否在listview上显示该字段信息
/// </summary>
private bool FShowColumn = true;
public bool ShowColumn
{
get { return FShowColumn; }
set { FShowColumn = value; }
}
}
#endregion
#region SearcherPropertyCollector
/// <summary>
/// 搜索控件属性集合器
/// </summary>
public class SearcherPropertyCollector
{
private TFieldPropertyData[] FFieldPropertyList;
public TFieldPropertyData[] FieldPropertyList// = new SortedList<string,TFieldPropertyData>();
{
get { return FFieldPropertyList; }
set { FFieldPropertyList = value; }
}
//----------private----------------
/// <summary>
/// 分析好的查询语句
/// </summary>
string FQuerySQL = "";
public string QuerySQL
{
get { return FQuerySQL; }
set { FQuerySQL = value; }
}
/// <summary>
/// sql语句
/// </summary>
String FSQL = "";
public string SQL
{
get { return FSQL; }
set { FSQL = value; }
}
/// <summary>
/// 初始化时候的SQL
/// </summary>
public string InitSQL { get; set; }
/// <summary>
/// 结果集主键
/// </summary>
String FKeyField = "";
public string KeyField
{
get { return FKeyField; }
set { FKeyField = value; }
}
/// <summary>
/// 查询字段名称
/// </summary>
String FQueryField = "";
public string QueryField
{
get { return FQueryField; }
set { FQueryField = value; }
}
/// <summary>
/// 查询字段名称
/// </summary>
String FRemarkField = "";
public string RemarkField
{
get { return FRemarkField; }
set { FRemarkField = value; }
}
/// <summary>
/// 返回字段名称
/// </summary>
String FReturnValueField = "";
public string ReturnValueField
{
get { return FReturnValueField; }
set { FReturnValueField = value; }
}
/// <summary>
/// 限制匹配最大数量
/// </summary>
int FReturnMaxCount = 50;
public int ReturnMaxCount
{
get { return FReturnMaxCount; }
set { FReturnMaxCount = value; }
}
/// <summary>
/// 是否转拼音
/// </summary>
bool FConvertToChineseSpell = false;
public bool ConvertToChineseSpell
{
get { return FConvertToChineseSpell; }
set { FConvertToChineseSpell = value; }
}
/// <summary>
/// 窗体显示的高度
/// </summary>
int FShowFormHeight = 230;
public int ShowFormHeight
{
get { return FShowFormHeight; }
set { FShowFormHeight = value; }
}
/// <summary>
/// 窗体显示的宽度
/// </summary>
int FShowFormWidth = 230;
public int ShowFormWidth
{
get { return FShowFormWidth; }
set { FShowFormWidth = value; }
}
/// <summary>
/// 匹配模式
/// </summary>
TSearchMatchWay FSearchMatchWay = TSearchMatchWay.swFuzzy;
public TSearchMatchWay SearchMatchWay
{
get { return FSearchMatchWay; }
set { FSearchMatchWay = value; }
}
#region GetQuerySql
public bool IsChina(string CString)
{
Console.WriteLine("{0}", CString.Length);
bool BoolValue = false;
for (int i = 0; i < CString.Length; i++)
{
if (Convert.ToInt32(Convert.ToChar(CString.Substring(i, 1))) < 128)
{
BoolValue = false;
}
else
{
BoolValue = true;
}
}
return BoolValue;
}
/// <summary>
/// 构造查询字符串
/// </summary>
/// <param name="QueryValue"></param>
/// <returns></returns>
public string GetQuerySql(string QueryValue, string text)
{
string sWhere = "";
string sOrderBy = "";
string sGroupBy = "";
string QueryString = "";
string sTemp1 = "";
string sTemp2 = "";
string sTemp3 = "";
string QueryCondition = "";
int indexGroupBy;
int indexOrderBy;
char[] charArr;
string strRet = "";
if (FRemarkField + "" == "")
FRemarkField = FQueryField;
FSQL = Regex.Replace(FSQL, "#[^##]+#", " 1=1 ");
if (false)
{
strRet = "set nocount on " + FSQL;
}
else
{
QueryCondition = "";
switch (FSearchMatchWay)
{
case TSearchMatchWay.swFuzzy:
{
if (IsChina(text))
{
foreach (TFieldPropertyData fpd in this.FieldPropertyList)
{
if (string.IsNullOrWhiteSpace(QueryCondition))
QueryCondition += fpd.FieldName + " like '%" + text + "%'";
else
QueryCondition += " or "+fpd.FieldName + " like '%" + text + "%'";
}
//QueryCondition = "(" + FQueryField + " like '%" + text + "%' or " + FRemarkField + " like '%" + text + "%') ";
}
else
{
//QueryCondition = "dbo.p_getpy(" + FQueryField + ") like '%" + QueryValue + "%'";
foreach (TFieldPropertyData fpd in this.FieldPropertyList)
{
if (string.IsNullOrWhiteSpace(QueryCondition))
QueryCondition += "dbo.p_getpy("+fpd.FieldName+")" + " like '%" + text + "%'";
else
QueryCondition += " or dbo.p_getpy(" + fpd.FieldName + ") like '%" + text + "%'";
}
//QueryCondition = "(dbo.p_getpy(" + FQueryField + ") like '%" + QueryValue + "%' or dbo.p_getpy(" + FRemarkField + ") like '%" + QueryValue + "%')";
}
break;
}
case TSearchMatchWay.swLeftFuzzy:
{
if (IsChina(text))
{
//QueryCondition = FQueryField + " like '%" + text + "' ";
foreach (TFieldPropertyData fpd in this.FieldPropertyList)
{
if (string.IsNullOrWhiteSpace(QueryCondition))
QueryCondition += fpd.FieldName + " like '%" + text + "'";
else
QueryCondition += " or " + fpd.FieldName + " like '%" + text + "'";
}
//QueryCondition = "(" + FQueryField + " like '%" + text + "' or " + FRemarkField + " like '%" + text + "')";
}
else
{
//QueryCondition = "dbo.p_getpy(" + FQueryField + ") like '%" + QueryValue + "'";
foreach (TFieldPropertyData fpd in this.FieldPropertyList)
{
if (string.IsNullOrWhiteSpace(QueryCondition))
QueryCondition += "dbo.p_getpy("+fpd.FieldName + ") like '%" + text + "'";
else
QueryCondition += " or dbo.p_getpy(" + fpd.FieldName + ") like '%" + text + "'";
}
//QueryCondition = "(dbo.p_getpy(" + FQueryField + ") like '%" + QueryValue + "' or dbo.p_getpy(" + FRemarkField + ") like '%" + QueryValue + "')";
}
break;
}
case TSearchMatchWay.swRightFuzzy:
{
if (IsChina(text))
{
//QueryCondition = FQueryField + " like '" + text + "%' ";
foreach (TFieldPropertyData fpd in this.FieldPropertyList)
{
if (string.IsNullOrWhiteSpace(QueryCondition))
QueryCondition += fpd.FieldName + " like '" + text + "%'";
else
QueryCondition += " or " + fpd.FieldName + " like '" + text + "%'";
}
//QueryCondition = "(" + FQueryField + " like '" + text + "%' or " + FRemarkField + " like '" + text + "%') ";
}
else
{
//QueryCondition = "dbo.p_getpy(" + FQueryField + ") like '" + QueryValue + "%' ";
foreach (TFieldPropertyData fpd in this.FieldPropertyList)
{
if (string.IsNullOrWhiteSpace(QueryCondition))
QueryCondition += "dbo.p_getpy(" + fpd.FieldName + ") like '" + text + "%'";
else
QueryCondition += " or dbo.p_getpy(" + fpd.FieldName + ") like '" + text + "%'";
}
//QueryCondition = "(dbo.p_getpy(" + FQueryField + ") like '" + QueryValue + "%' or dbo.p_getpy(" + FRemarkField + ") like '" + QueryValue + "%') ";
}
break;
}
case TSearchMatchWay.swFullEqual:
{
if (IsChina(text))
{
//QueryCondition = FQueryField + " ='" + text + "' ";
foreach (TFieldPropertyData fpd in this.FieldPropertyList)
{
if (string.IsNullOrWhiteSpace(QueryCondition))
QueryCondition += fpd.FieldName + " = '" + text + "'";
else
QueryCondition += " or " + fpd.FieldName + " = '" + text + "'";
}
//QueryCondition = "(" + FQueryField + " ='" + text + "' or " + FRemarkField + " ='" + text + "') ";
}
else
{
//QueryCondition = "dbo.p_getpy(" + FQueryField + ")='" + QueryValue + "'";
foreach (TFieldPropertyData fpd in this.FieldPropertyList)
{
if (string.IsNullOrWhiteSpace(QueryCondition))
QueryCondition += "dbo.p_getpy("+fpd.FieldName + ") = '" + text + "'";
else
QueryCondition += " or dbo.p_getpy(" + fpd.FieldName + ") = '" + text + "'";
}
//QueryCondition = "(dbo.p_getpy(" + FQueryField + ")='" + QueryValue + "' or dbo.p_getpy(" + FRemarkField + ")='" + QueryValue + "')";
}
break;
}
}
QueryCondition = "(" + QueryCondition + ")";
//MessageBox.Show(QueryCondition);
QueryString = "select * from (" + FSQL + ") tab";
//MessageBox.Show(QueryString + " where " + QueryCondition);
return QueryString + " where " + QueryCondition;
//QueryString = FSQL;
//int indexWhere = QueryString.IndexOf("where");
//if (indexWhere != -1)//有where条件的
//{
// sWhere = QueryString.Substring(indexWhere, QueryString.Length - indexWhere);
// strRet = QueryString.Substring(0, indexWhere) + " where (";
// sTemp1 = sWhere;
// sTemp1 = sTemp1.Remove(0, 5);
// charArr = sTemp1.ToCharArray();
// Array.Reverse(charArr);
// sTemp2 = new string(charArr);
// sTemp1 = sWhere;
// QueryString = sTemp2;
// sTemp3 = sTemp1;
// sTemp3 = sTemp3.Remove(0, 5);
// indexGroupBy = QueryString.IndexOf("yb puorg");
// if (indexGroupBy != -1) {
// sGroupBy = QueryString.Substring(indexGroupBy, QueryString.Length - indexGroupBy);
// strRet = strRet + sTemp3.Substring(0, sGroupBy.Length - 9) + ") and " + QueryCondition + sTemp3.Substring(sTemp3.Length - sGroupBy.Length + 8, sTemp3.Length - sGroupBy.Length + 9);
// }
// else {
// indexOrderBy = QueryString.IndexOf("yb redro");
// if (indexOrderBy != -1) {
// sOrderBy = QueryString.Substring(indexOrderBy, QueryString.Length - indexOrderBy);
// strRet = strRet + sTemp3.Substring(0, sOrderBy.Length - 9) + ") and " + QueryCondition + sTemp3.Substring(sTemp3.Length - sOrderBy.Length + 8, sTemp3.Length - sOrderBy.Length + 9);
// }
// else
// strRet = strRet + sTemp3 + ") and " + QueryCondition;
// }
//}
//else {
//--没有where条件的
sTemp1 = QueryString;
charArr = sTemp1.ToCharArray();
Array.Reverse(charArr);
sTemp2 = new string(charArr);
QueryString = sTemp2;
indexGroupBy = QueryString.IndexOf("yb puorg");
if (indexGroupBy != -1)//--有group by
{
sGroupBy = QueryString.Substring(indexGroupBy, QueryString.Length - indexGroupBy);
strRet = sTemp1.Substring(0, sGroupBy.Length - 8) + " where " + QueryCondition + sTemp1.Substring(sTemp1.Length - sGroupBy.Length + 7, sTemp1.Length - sGroupBy.Length + 8);
}
else
{//--没有group by
indexOrderBy = QueryString.IndexOf("yb redro");
if (indexOrderBy != -1)//--有order by
{
sOrderBy = QueryString.Substring(indexOrderBy, QueryString.Length - indexOrderBy);
strRet = sTemp1.Substring(0, sOrderBy.Length - 8) + " where " + QueryCondition + sTemp1.Substring(sTemp1.Length - sOrderBy.Length + 7, sTemp1.Length - sOrderBy.Length + 8);
}
else
strRet = sTemp1 + " where " + QueryCondition;
}
strRet = "set nocount on " + strRet;
//}
}
//MessageBox.Show(strRet);
return strRet.Replace("50", "2000");
//return strRet;
}
#endregion
}
#endregion
/// <summary>
/// 自动搜索器
/// </summary>
public partial class AutoSearcher : TextBox
{
//-----------------------属性---------------------------------------
SearcherPropertyCollector FSearcherPropertyCollector;
[Browsable(true)]
[Editor(typeof(AutoSearcherEditor), typeof(UITypeEditor))]
public SearcherPropertyCollector searcherPropertyCollector
{
get
{
return FSearcherPropertyCollector;
}
set
{
FSearcherPropertyCollector = value;
}
}
/// <summary>
/// 文本框改变之前
/// </summary>
public event EventHandler OnTextChangedBefore;
public void testFun()
{
ControlLib.inh.autosearcher_Res.FrmPropertySet ss = new autosearcher_Res.FrmPropertySet(FSearcherPropertyCollector);
ss.ShowDialog();
}
//---------------------------公开字段-----------------------
public bool bNotCheck = false;
public string ReturnValue = "";
public string addDllModuleId = "";
public string addModuleCaption = "";
public string addDllName = "";
public string addResultValue = "";
public string OperatorName = "";
public string OperatorId = "";
//默认分类 智能搜索组件添加时用
public string SpeciesNo = "01";
/// <summary>
/// 控件所在的面板
/// </summary>
public Control SearchControlPanel { get; set; }
//-----------------------------------------------私有字段---------------
private string strPreWords = "";
private string stText = "";
private int iQueryFieldSeq = -1;
private List<string> m_FieldList;
private ListView FListVAuto;
private string StrOld = "";
private FrmAutoSearch FrmAutoShowForm;
private bool FbSetOldEvent = false;
private int iReturnFieldSeq = -1;
private Thread TheadHandle = null;
private bool bChanged = false;
/// <summary>
/// 构造函数
/// </summary>
public AutoSearcher()
{
Init();
}
/// <summary>
/// 析构函数
/// </summary>
~AutoSearcher()
{
FSearcherPropertyCollector = null;
if (m_FieldList != null)
m_FieldList.Clear();
m_FieldList = null;
if (FrmAutoShowForm != null)
{
FrmAutoShowForm.CanClose = true;
FrmAutoShowForm.Close();
}
FrmAutoShowForm = null;
if (TheadHandle != null)
TheadHandle.Abort();
TheadHandle = null;
}
/// <summary>
/// 初始化函数
/// </summary>
private void Init()
{
Text = "";
FrmAutoShowForm = new FrmAutoSearch();
FListVAuto = FrmAutoShowForm.ListV;
FListVAuto.Click += new EventHandler(OnListVClick);
FListVAuto.KeyUp += new KeyEventHandler(OnProKeyUp);
this.Leave += new EventHandler(OnSelfLostFocus);
this.KeyUp += new KeyEventHandler(onSelfKeyUp);
this.Enter += new EventHandler(AutoSearcher_Enter);
this.MouseDown += new MouseEventHandler(AutoSearcher_MouseDown);
this.MouseUp += new MouseEventHandler(AutoSearcher_MouseUp);
m_FieldList = new List<string>();
}
void AutoSearcher_Enter(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(StrOld)) return;
if ((sender as AutoSearcher).ReadOnly)
return;
if (OnTextChangedBefore != null) OnTextChangedBefore(sender, e);
SetFormPos(FrmAutoShowForm.ListV, this, true);
stText = "";// Text.Trim();
StrOld = stText;
FrmAutoShowForm.Show();
if (TheadHandle == null)
{
TheadHandle = new Thread(QueryFillList);
TheadHandle.IsBackground = true;
TheadHandle.Start(FrmAutoShowForm.ListV);
//QueryFillList(FrmAutoShowForm.ListV);
}
else
bChanged = true;
this.Focus();
}
void AutoSearcher_MouseDown(object sender, MouseEventArgs e)
{
if ((sender as AutoSearcher).ReadOnly)
return;
if (OnTextChangedBefore != null) OnTextChangedBefore(sender, e);
SetFormPos(FrmAutoShowForm.ListV, this, true);
stText = "";// Text.Trim();
StrOld = stText;
FrmAutoShowForm.Show();
if (TheadHandle == null)
{
TheadHandle = new Thread(QueryFillList);
TheadHandle.IsBackground = true;
TheadHandle.Start(FrmAutoShowForm.ListV);
//QueryFillList(FrmAutoShowForm.ListV);
}
else
bChanged = true;
this.Focus();
}
void AutoSearcher_MouseUp(object sender, MouseEventArgs e)
{
this.SelectAll();
}
/// <summary>
/// 输入内容变化处理过程
/// </summary>
/// <param name="e"></param>
protected override void OnTextChanged(EventArgs e)
{
//if (DesignMode)MessageBox.Show("设计状态");
if (OnTextChangedBefore != null) OnTextChangedBefore(this, e);
if (DesignMode == false && bNotCheck == false && this.Focused)
{
try
{
if (!SetFormPos(FrmAutoShowForm.ListV, this, true))
return;
//MessageBox.Show("OK");
stText = Text.Trim();
StrOld = stText;
//FrmAutoShowForm.Show();
if (TheadHandle == null)
{
TheadHandle = new Thread(QueryFillList);
TheadHandle.IsBackground = true;
TheadHandle.Start(FrmAutoShowForm.ListV);
//QueryFillList(FrmAutoShowForm.ListV);
}
else
bChanged = true;
this.Focus();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
SetAutoSearchWidth();
base.OnTextChanged(e);
}
private void SetAutoSearchWidth()
{
try
{
int parentWidth = 0;
for (int i = 0; i < FrmAutoShowForm.widthList.Count; i++)
{
ListView lv = FrmAutoShowForm.ListV;
if (i == 0)
lv.Columns[i].Width = 0;
else
{
lv.Columns[i].Width = FrmAutoShowForm.widthList[i];
lv.Columns[i].Width = -1;
}
parentWidth += FrmAutoShowForm.widthList[i];
}
if (parentWidth > 0 && FrmAutoShowForm.Width < parentWidth)
FrmAutoShowForm.Width = parentWidth;
}
catch (Exception)
{
}
}
private void AddShowColumn(ListView listv, string caption, int w)
{
ColumnHeader header = new ColumnHeader();
header.Text = caption;
header.Width = w;
listv.Columns.Add(header);
}
private string MakeSpellCode(string strSrc, int max)
{
return SpellCodeFunction.MakeSpellCode(strSrc, max);
}
#region QueryFillList
/// <summary>
/// 线程处理过程
/// </summary>
/// <param name="obj"></param>
private void QueryFillList(object obj)
{
ListView ListV = (ListView)obj;
int i;
int iCounter;
ListViewItem Item;
String ResValue;
Boolean bMatched;
FrmAutoShowForm.Invoke(new FrmAutoSearch.FunctionNameNoParams(FrmAutoShowForm.StartQuerying));
do
{
bChanged = false;
try
{
iCounter = 0;
if (FSearcherPropertyCollector.ConvertToChineseSpell)
stText = MakeSpellCode(stText, 1000);
//if (ListV.Items.Count > 0 && strPreWords != "" && stText.StartsWith(strPreWords)
// && (FSearcherPropertyCollector.SearchMatchWay != TSearchMatchWay.swRightFuzzy) &&
// (FSearcherPropertyCollector.SearchMatchWay != TSearchMatchWay.swFullEqual))
//{
// i = 0;
// while (i < ListV.Items.Count)
// {
// if (this.InvokeRequired)
// {
// Item = (ListViewItem)FrmAutoShowForm.Invoke(new FrmAutoSearch.FunctionName(FrmAutoShowForm.DoGetItem), new object[] { i });
// }
// else
// {
// Item = ListV.Items[i];
// }
// if (FSearcherPropertyCollector.ConvertToChineseSpell)
// {
// ResValue = MakeSpellCode(Item.SubItems[iQueryFieldSeq].Text, 1000);
// }
// else
// {
// ResValue = Item.SubItems[iQueryFieldSeq].Text;
// }
// //bMatched = false;
// //switch (FSearcherPropertyCollector.SearchMatchWay)
// //{
// // case TSearchMatchWay.swFuzzy:
// // {
// // bMatched = ResValue.IndexOf(stText) != -1;
// // break;
// // }
// // case TSearchMatchWay.swLeftFuzzy:
// // {
// // bMatched = ResValue.StartsWith(stText);
// // break;
// // }
// //}
// //if (!bMatched)
// //{
// if (this.InvokeRequired)
// {
// Action<int> dRemoveAt = ListV.Items.RemoveAt;
// this.FListVAuto.Invoke(dRemoveAt, i);
// }
// else
// {
// ListV.Items.RemoveAt(i);
// }
// //}
// //else
// //{
// i++;
// //}
// }
//}
//else
//{
string strSql = FSearcherPropertyCollector.GetQuerySql(stText, this.Text);
//MessageBox.Show( strSql );
//SqlCommand cmd = new SqlCommand();
//cmd.Connection = conn;
//cmd.CommandType = CommandType.Text;
//cmd.CommandText = strSql;
this.Invoke(new EventHandler(delegate
{
ListV.BeginUpdate();
}));
using (SqlDataReader dr = SqlHelper.ExecuteReader(CommandType.Text, strSql, null))
{
if (this.InvokeRequired)
{
Action dClear = ListV.Items.Clear;
this.FListVAuto.Invoke(dClear);
}
else
{
ListV.Items.Clear();
}
while (dr.Read() && iCounter < FSearcherPropertyCollector.ReturnMaxCount)
{
// 去除匹配模式
//bMatched = false;
//if (FSearcherPropertyCollector.ConvertToChineseSpell && stText.Trim() != "") {
// ResValue = MakeSpellCode(dr[FSearcherPropertyCollector.QueryField].ToString(), 1000);
// switch (FSearcherPropertyCollector.SearchMatchWay) {
// case TSearchMatchWay.swFuzzy: {
// bMatched = ResValue.IndexOf(stText) != -1;
// break;
// }
// case TSearchMatchWay.swLeftFuzzy: {
// bMatched = ResValue.StartsWith(stText);
// break;
// }
// case TSearchMatchWay.swRightFuzzy: {
// bMatched = ResValue.EndsWith(stText);
// break;
// }
// case TSearchMatchWay.swFullEqual: {
// bMatched = stText == ResValue;
// break;
// }
// }
//}
//else {
// ResValue = dr[FSearcherPropertyCollector.QueryField].ToString();
// bMatched = true;
//}
//--add matched data
//if (bMatched) {
Item = new ListViewItem();
Item.Text = "";
for (i = 0; i < m_FieldList.Count; i++)
{
Item.SubItems.Add(dr[m_FieldList[i]].ToString());
}
if (this.InvokeRequired)
{
FrmAutoShowForm.Invoke(new FrmAutoSearch.FunctionName(FrmAutoShowForm.AddListVItem), new object[] { Item });
}
else
{
ListV.Items.Add(Item);
}
iCounter++;
//}
}
}
this.Invoke(new EventHandler(delegate
{
ListV.EndUpdate();
}));
//cmd.Dispose();
//cmd = null;
//}
FrmAutoShowForm.Invoke(new FrmAutoSearch.FunctionNameNoParams(FrmAutoShowForm.DoSelectItem));
if (FSearcherPropertyCollector.ConvertToChineseSpell)
{
strPreWords = stText;
if (iCounter == FSearcherPropertyCollector.ReturnMaxCount)
strPreWords = "";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} while (bChanged);
TheadHandle = null;
FrmAutoShowForm.Invoke(new FrmAutoSearch.FunctionNameNoParams(FrmAutoShowForm.EndQuerying));
SetAutoSearchWidth();
}
#endregion
/// <summary>
/// 在父窗体关闭的时候也关闭结果集窗体
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ParentFormClose(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
FrmAutoShowForm.Hide();
if (FrmAutoShowForm.Parent != null)
{
(FrmAutoShowForm.Parent as Form).FormClosing -= new FormClosingEventHandler(ParentFormClose);
//FrmAutoShowForm.Parent.Controls.Remove(FrmAutoShowForm);
}
//FrmAutoShowForm.Parent = null;
}
}
#region SetFormPos
/// <summary>
/// 设置窗体位置
/// </summary>
/// <param name="ShowCtrl"></param>
/// <param name="OwnerCtrl"></param>
/// <param name="bParentSet"></param>
/// <returns></returns>
private bool SetFormPos(ListView ShowCtrl, Control OwnerCtrl, bool bParentSet)
{
Control F;
Form form = null;
int iTop;
int iLeft;
int iWidth;
String strInputValue = (OwnerCtrl as TextBox).Text.Trim();
bool bRet = false;
//--在原来的基础上不断加上空格不管
//comment
//if (ReturnValue != string.Empty && strInputValue != string.Empty && strInputValue == StrOld)
// return bRet;
//comment
// 叠词输入也要搜索例如:StrOld为x,在输入x时需要搜索
//if (strInputValue.StartsWith(StrOld) && StrOld != "" &&
// ShowCtrl.Items.Count <= 0 && FSearcherPropertyCollector.SearchMatchWay != TSearchMatchWay.swRightFuzzy
// && FSearcherPropertyCollector.SearchMatchWay != TSearchMatchWay.swFullEqual)
// return bRet;
//comment
//if (ReturnValue != string.Empty && ShowCtrl.Items.Count > 0 && strInputValue == StrOld)
// return bRet;
//comment
//if (conn == null) {
// MessageBox.Show("数据库连接器不能为空!", "Error");
// return bRet;
//}
//if (conn.State == ConnectionState.Closed) {
// MessageBox.Show("数据库连接器不能为关闭状态!", "Error");
// return bRet;
//}
if (FSearcherPropertyCollector.SQL == string.Empty)
{
MessageBox.Show("没有配置有查询语句!", "Error");
return bRet;
}
if (ShowCtrl.Columns.Count == 0)
{
FrmAutoShowForm.Height = FSearcherPropertyCollector.ShowFormHeight;
FrmAutoShowForm.Width = FSearcherPropertyCollector.ShowFormWidth;
iWidth = 0;
AddShowColumn(ShowCtrl, "", 1);
for (int i = 0; i < FSearcherPropertyCollector.FieldPropertyList.Length; i++)
{
TFieldPropertyData kv = FSearcherPropertyCollector.FieldPropertyList[i];
if (kv.ShowColumn)
{
AddShowColumn(ShowCtrl, kv.FieldCaption, kv.FieldWidth);
iWidth = iWidth + kv.FieldWidth;
m_FieldList.Add(kv.FieldName);
if (kv.FieldName == FSearcherPropertyCollector.ReturnValueField)
iReturnFieldSeq = m_FieldList.Count;//第一列抛开不算
if (kv.FieldName == FSearcherPropertyCollector.QueryField)
iQueryFieldSeq = m_FieldList.Count;//第一列抛开不算
}
}
if (FSearcherPropertyCollector.ShowFormWidth == 0)
FrmAutoShowForm.Width = iWidth + 20;
}
try
{
//ReturnValue = "";
form = GetForm(OwnerCtrl.Parent);
if (form != null) //--如果没有输入任何信息也要查询
{
if (!FbSetOldEvent && bParentSet)
{
(form as Form).FormClosing += new FormClosingEventHandler(ParentFormClose);
FrmAutoShowForm.TopLevel = false;
FrmAutoShowForm.Parent = form;
//form.Controls.Add(FrmAutoShowForm);
for (int k = 0; k < 20; k++)
FrmAutoShowForm.BringToFront();
FbSetOldEvent = true;
}
F = OwnerCtrl.Parent;
iTop = OwnerCtrl.Top + OwnerCtrl.Height;
iLeft = OwnerCtrl.Left;
while (F != form)
{
iTop = iTop + F.Top;
iLeft = iLeft + F.Left;
F = F.Parent;
}
if (iTop + this.Height + FrmAutoShowForm.Height > F.Height)
{
if (iTop - this.Height > F.Height - iTop)
{
if (FrmAutoShowForm.Height > iTop - OwnerCtrl.Height)
{
FrmAutoShowForm.Height = iTop - OwnerCtrl.Height;
iTop = 0;
}
else
iTop = iTop - this.Height - FrmAutoShowForm.Height;
}
else
FrmAutoShowForm.Height = F.Height - iTop - 30;
}
if (iLeft + FrmAutoShowForm.Width > F.Width)
{
if (iLeft + this.Width > F.Width - iLeft)
{
if (FrmAutoShowForm.Width > iLeft + OwnerCtrl.Width)
{
FrmAutoShowForm.Width = iLeft + OwnerCtrl.Width;
iLeft = 0;
}
else
iLeft = iLeft + OwnerCtrl.Width - FrmAutoShowForm.Width;
}
else
FrmAutoShowForm.Width = F.Width - iLeft - 30;
}
FrmAutoShowForm.Left = iLeft;
FrmAutoShowForm.Top = iTop;
FrmAutoShowForm.addDllName = addDllName;
FrmAutoShowForm.addModuleId = addDllModuleId;
FrmAutoShowForm.FormText = addModuleCaption;
FrmAutoShowForm.OperatorId = OperatorId;
FrmAutoShowForm.OperatorName = OperatorName;
FrmAutoShowForm.SpeciesNo = SpeciesNo;
FrmAutoShowForm.addResultValue = addResultValue;
FrmAutoShowForm.autos = this;
bRet = true;
}
//FrmAutoShowForm.Width = 400;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return bRet;
}
#endregion
private Form GetForm(Control ctr)
{
if (ctr is Form)
{
return ctr as Form;
}
else
{
return GetForm(ctr.Parent);
}
}
/// <summary>
/// 点击数据集listview控件事件处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnListVClick(object sender, EventArgs e)
{
if (FListVAuto.Items.Count <= 0 || FListVAuto.SelectedItems.Count <= 0)
return;
ReturnValue = FListVAuto.SelectedItems[0].SubItems[iReturnFieldSeq].Text;
bNotCheck = true;
Text = FListVAuto.SelectedItems[0].SubItems[iQueryFieldSeq].Text;
StrOld = Text;
bNotCheck = false;
FrmAutoShowForm.Hide();
//added by dl 2015-6-29
Control ctl = this.Parent.Parent;
if (ctl != null)
{
//this.Parent.Parent.Parent.SelectNextControl(this, true, false, true, false);
try
{
//Control ct = this.Parent.Parent.Parent.GetNextControl(this, true);
//if (ct != null)
// ct.Focus();
}
catch (Exception)
{
}
ctl.Focus();
//MessageBox.Show(ct.Name);
}
SetEventActive();
this.OnTextChanged(e); // 选择表格数据后,通知文本框数据已经改变
}
/// <summary>
/// 数据集listview控件回车事件处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnProKeyUp(object sender, KeyEventArgs e)
{
switch (e.KeyValue)
{
case 13:
{
try
{
if (FListVAuto.Items.Count <= 0 && FListVAuto.SelectedItems.Count <= 0)
return;
ReturnValue = FListVAuto.SelectedItems[0].SubItems[iReturnFieldSeq].Text;
bNotCheck = true;
Text = FListVAuto.SelectedItems[0].SubItems[iQueryFieldSeq].Text;
StrOld = Text;
bNotCheck = false;
FrmAutoShowForm.Hide();
//added by dl 2015-6-29
Control ctl = this.Parent.Parent;
if (ctl != null)
this.Parent.Parent.Parent.SelectNextControl(this, true, false, true, false);
SetEventActive();
this.OnTextChanged(e); // 选择表格数据后,通知文本框数据已经改变
ctl.Focus();
}
catch (Exception)
{
}
break;
}
case 27:
{
FrmAutoShowForm.Hide();
break;
}
}
}
public bool IsEmpet { get; set; }
public bool IsClear = true;
/// <summary>
/// 输入控件失去焦点事件处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnSelfLostFocus(object sender, EventArgs e)
{
if (!FListVAuto.Focused && ReturnValue == "" && this.Text == "")
{
bNotCheck = true;
if (IsClear)
this.Text = "";
bNotCheck = false;
}
if (FrmAutoShowForm.Visible && !FListVAuto.Focused)
{
//ReturnValue = "";
SetValueSilent("", this.Text);
FrmAutoShowForm.Hide();
SetEventActive();
}
if ((this.Text != "") && (this.Enabled) && (this.ReadOnly))
{
//ReturnValue = "";
SetValueSilent("", this.Text);
}
}
/// 输入框回车事件的处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void onSelfKeyUp(object sender, KeyEventArgs e)
{
if (e.KeyValue == 13)
{
if (Text.Trim() == "")
OnTextChanged(null);
if (FrmAutoShowForm.Visible)
FListVAuto.Focus();
}
if (e.KeyValue == 27)
{
if (FrmAutoShowForm.Visible)
FrmAutoShowForm.Visible = false;
}
}
/// <summary>
/// 定义事件类型
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void GetReturnValueEventHandler(object sender, EventArgs e);
/// <summary>
/// 定义事件变量
/// </summary>
public event GetReturnValueEventHandler GetReturnValue;
/// <summary>
/// 触发事件,通知外部方法已经得到数据
/// </summary>
private void SetEventActive()
{
if (GetReturnValue != null)
GetReturnValue(this, new EventArgs());
}
/// <summary>
/// 不弹出搜索窗口模式下设置字符串和值
/// </summary>
/// <param name="strText"></param>
/// <param name="strValue"></param>
public void SetValueSilent(string sValue, string sText)
{
bool preV = this.bNotCheck;
this.bNotCheck = true;
Text = sText.Trim();
ReturnValue = sValue.Trim();
if (ReturnValue == "" && Text != "")
{
try
{
bool preConvert = FSearcherPropertyCollector.ConvertToChineseSpell;
FSearcherPropertyCollector.ConvertToChineseSpell = false;
string strSql = FSearcherPropertyCollector.SQL.Replace("top 50", "top 500");
strSql = Regex.Replace(strSql, "#[^##]+#", " 1=1 ");
if (!string.IsNullOrEmpty(strSql))
{
if (strSql.IndexOf("order by", StringComparison.OrdinalIgnoreCase) != -1)
{
int indexOrder = strSql.IndexOf("order by", StringComparison.OrdinalIgnoreCase);
string sOrder = string.Empty;
if (indexOrder != -1)
{
sOrder = strSql.Substring(indexOrder, strSql.Length - indexOrder);
strSql = "select * from (" + strSql.Substring(0, indexOrder - 1) + ") as t where " + FSearcherPropertyCollector.QueryField + "='" + sText + "' " + sOrder;
}
}
else
{
strSql = "select * from (" + strSql + ") as t where " + FSearcherPropertyCollector.QueryField + "='" + sText + "'";
}
}
Text = "";
FSearcherPropertyCollector.ConvertToChineseSpell = preConvert;
DataTable dt = SqlHelper.ExecuteDataSet(strSql).Tables[0];
if ((dt != null) && (dt.Rows.Count > 0))
{
ReturnValue = dt.Rows[0][FSearcherPropertyCollector.ReturnValueField].ToString();
SetValueSilent(ReturnValue, "");
}
}
catch (Exception ex)
{
//MessageBox.Show(ex.Message);
}
}
else if (ReturnValue != "")
{
try
{
bool preConvert = FSearcherPropertyCollector.ConvertToChineseSpell;
FSearcherPropertyCollector.ConvertToChineseSpell = false;
string strSql = FSearcherPropertyCollector.SQL;
strSql = Regex.Replace(strSql, "#[^##]+#", " 1=1 ");
if (!string.IsNullOrEmpty(strSql))
{
if (strSql.IndexOf("order by", StringComparison.OrdinalIgnoreCase) != -1)
{
int indexOrder = strSql.IndexOf("order by", StringComparison.OrdinalIgnoreCase);
string sOrder = string.Empty;
if (indexOrder != -1)
{
sOrder = strSql.Substring(indexOrder, strSql.Length - indexOrder);
strSql = "select * from (" + strSql.Substring(0, indexOrder - 1) + ") as t where " + FSearcherPropertyCollector.KeyField + "='" + ReturnValue + "' " + sOrder;
}
}
else
{
strSql = "select * from (" + strSql + ") as t where " + FSearcherPropertyCollector.KeyField + "='" + ReturnValue + "'";
}
}
FSearcherPropertyCollector.ConvertToChineseSpell = preConvert;
DataTable dt = SqlHelper.ExecuteDataSet(strSql).Tables[0];
if ((dt != null) && (dt.Rows.Count > 0))
{
this.Text = dt.Rows[0][FSearcherPropertyCollector.QueryField].ToString();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
this.bNotCheck = preV;
}
}
}