using System; using System.Data; using System.Drawing; using System.Windows.Forms; using UAS_MES_NEW.CustomControl.TextBoxWithIcon; using UAS_MES_NEW.DataOperate; using UAS_MES_NEW.Entity; using UAS_MES_NEW.PublicMethod; namespace UAS_MES_NEW { public partial class DbFind : CustomControl.BaseForm.BaseForm { //判断是否配置了DbFind bool IsAbleDbFind; //双击选择的工单号 string TextBoxValue = ""; DataHelper dh = SystemInf.dh; DataTable dt = new DataTable(); Control[] ctl; //DBFind查询的字段 string MainField; //需要赋值的字段 string[] SetValueField; //需要查询的全部字段 string SelectField; //发起DbFind请求的窗口 string FormName; //是否配置了DBfind string Caller; //需要查询的表 string BindTable; string Condition = ""; Control MainControl; public bool SuccessReturnData = false; int ScrollNewValue = 0; public bool IsAbleDbFind1 { get { return IsAbleDbFind; } set { IsAbleDbFind = value; } } public string TextBoxValue1 { get { return TextBoxValue; } set { TextBoxValue = value; } } /// /// /// /// /// /// /// public DbFind(string field, string tablename, string selectfield, string[] setValueField, string caller, string formname, string condition) { InitializeComponent(); DoubleBuffered = true; try { StartPosition = FormStartPosition.CenterParent; MainField = field; FormName = formname; SetValueField = setValueField; Caller = caller; Condition = condition + ""; BindTable = tablename; SelectField = selectfield.Replace("#", " as "); //返回一个带有结构的空的DataTable dt = (DataTable)dh.ExecuteSql("select " + SelectField + " from " + tablename + " where ROWNUM<20", "select"); //设置DataTable的描述和列名,为了字段赋值 selectfield = selectfield.Replace(",", "#"); string[] NameAndCapation = selectfield.Split('#'); int index = 0; //设置列的描述和名称 for (int i = 0; i < dt.Columns.Count; i++) { dt.Columns[i].Caption = NameAndCapation[index].Trim(); index = index + 1; dt.Columns[i].ColumnName = NameAndCapation[index].Trim(); index = index + 1; } if (dt != null) { //先绑定空的结构 DbFindGridView.DataSource = dt; for (int i = 0; i < DbFindGridView.Columns.Count; i++) { DbFindGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; } //获取查询的字段的拼接语句 pagination1.BindDataToNavigator(DbFindGridView, tablename, SelectField, "ID", caller, Condition == null ? "" : Condition); IsAbleDbFind = true; } } catch (Exception EB) { LogManager.DoLog(EB.Message); IsAbleDbFind = false; } } protected override void WndProc(ref Message m) { //拦截双击标题栏、移动窗体的系统消息 if (m.Msg != 0xA3) base.WndProc(ref m); } private void DbFind_Load(object sender, EventArgs e) { //用来存放过滤的TextBox的控件 ctl = new Control[dt.Columns.Count]; //Dock是添加的越后面展示时越前面,所以需要从大到小排放 for (int i = dt.Columns.Count - 1; i >= 0; i--) { EnterTextBox etb = new EnterTextBox(); etb.Dock = DockStyle.Left; etb.Location = new Point(DbFindGridView.RowHeadersWidth, DbFindGridView.Columns[i].Width); etb.Name = dt.Columns[i].Caption; etb.Tag = dt.Columns[i].Caption; etb.Size = new Size(DbFindGridView.Columns[i].Width, 22); etb.KeyDown += FilterData; this.Controls.Add(etb); //记录这个生成的控件,后续用于拼接条件 ctl[i] = etb; } //最后用一个不可编辑的占住头部长度 EnterTextBox Head = new EnterTextBox(); Head.Name = "PlaceHolder"; Head.Enabled = false; Head.Dock = DockStyle.Left; Head.Location = new Point(0, DbFindGridView.RowHeadersWidth); Head.Size = new Size(DbFindGridView.RowHeadersWidth, 22); this.Controls.Add(Head); } /// /// 过滤条件 /// /// /// private void FilterData(object sender, KeyEventArgs e) { //筛选数据需要将当前页重置到1 //并且手动执行一次刷新 if (e.KeyCode == Keys.Enter) { pagination1.Current_Page = 1; pagination1.GetPageData(); //所有输入框的条件拼接 string filterCondition = BaseUtil.GetScreenSqlCondition(ctl).Replace("where", "").Trim(); //拼接条件为空初始条件不为空 if (filterCondition == "" && Condition != "") filterCondition = Condition; //拼接和初始条件都不为空 else if (filterCondition != "" && Condition.Trim() != "") filterCondition = filterCondition + " and " + Condition; pagination1.BindDataToNavigator(DbFindGridView, BindTable, SelectField, "ID", Caller, filterCondition); } } //给打开窗体的对应字段赋值 private void DbFindGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex >= 0) { FormCollection fmCollection = Application.OpenForms; ControlCollection controls = (ControlCollection)fmCollection[FormName].Controls; try { //先判断DataTable里面是否有这个字段,然后从打开的窗口里面去获取到这个Form,从Form中的指定Panel获取到指定字段的控件 for (int i = 0; i < dt.Columns.Count; i++) { fillControl(e, i, fmCollection[FormName]); } //发起DBFind的控件 SuccessReturnData = true; if (MainControl is MaCodeSearchTextBox) { MaCodeSearchTextBox ctl = (MainControl as MaCodeSearchTextBox); ctl.GetData(true); } if (MainControl is SearchTextBox) { SearchTextBox ctl = (MainControl as SearchTextBox); ctl.GetData(); } MainControl.Focus(); } catch (Exception ea) { LogManager.DoLog(ea.Message); SuccessReturnData = false; } dt = (DataTable)DbFindGridView.DataSource; for (int i = 0; i < dt.Columns.Count; i++) { if (MainControl.Name == dt.Columns[i].Caption) { TextBoxValue = dt.Rows[e.RowIndex][i].ToString(); break; } } Dispose(); Close(); } } private void fillControl(DataGridViewCellEventArgs e, int i, Control ct) { for (int j = 0; j < SetValueField.Length; j++) { if (ct.Controls.Count > 0 && ct.Name.ToString() != SetValueField[j]) { Control.ControlCollection controls = ct.Controls; for (int k = 0; k < ct.Controls.Count; k++) { fillControl(e, i, controls[k]); } } else { if (ct.Name == MainField) { MainControl = ct; } if ((SetValueField[j] == dt.Columns[i].Caption || SetValueField[j] == dt.Columns[i].ColumnName || SetValueField[j].Contains(dt.Columns[i].Caption) || (ct != null && ct.Tag != null && ct.Tag.ToString() == dt.Columns[i].Caption)) && ct.Name.ToString().ToUpper() == SetValueField[j].ToUpper()) ct.Text = DbFindGridView.Rows[e.RowIndex].Cells[dt.Columns[i].ColumnName].Value.ToString(); } } } //按下Esc键的时候关闭当前的界面,用于DbFind private void DbFindGridView_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)Keys.Escape) { Dispose(); Close(); } } //列宽发生变化的时候TextBox的宽度也发生变化 private void DbFindGridView_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e) { if (ctl != null) ctl[DbFindGridView.Columns.IndexOf(e.Column)].Width = e.Column.Width; } private void DbFindGridView_Scroll(object sender, ScrollEventArgs e) { //结合已拖动的长度和列宽计算此列当前展示的长度 ScrollNewValue = e.NewValue; if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll) { int ColumnWidth = 0; for (int i = 0; i < dt.Columns.Count; i++) { ColumnWidth += DbFindGridView.Columns[i].Width; //如果有列被完全遮蔽,设置对应的输入框宽度为0 if (ColumnWidth < ScrollNewValue) Controls[dt.Columns[i].Caption].Width = 0; else if (ColumnWidth > ScrollNewValue) { Controls[dt.Columns[i].Caption].Width = ColumnWidth - ScrollNewValue; break; } } } } private void DbFind_FormClosing(object sender, FormClosingEventArgs e) { dh.Dispose(); } } }