using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using CommonLib.data; using CommonLib; using DevExpress.XtraGrid.Columns; using DevExpress.Utils; using DevExpress.XtraGrid.Views.Grid; using System.Collections; using DevExpress.XtraEditors; namespace Lskj.MyControl.LookUp { public partial class FrmMain : FormBase { #region 外部属性 /// /// sql语句 /// public string SQL { get; set; } public string sourceSQL { get; set; } /// /// 列集合 /// public Dictionary Columns { get; set; } /// /// 选择Value字段 /// public string ValueField { get; set; } /// /// 选择Text字段 /// public string TextField { get; set; } /// /// 是否多选 /// public bool IsMultiple { get; set; } /// /// 窗体高度 /// public int WinHeight { get; set; } /// /// 窗体宽度 /// public int WinWidth { get; set; } /// /// 返回Value /// public string ReturnValue { get; set; } /// /// 返回Text /// public string ReturnText { get; set; } /// /// 窗体标题 /// public string FrmTitle { get; set; } /// /// /// public int IsText { get; set; } #endregion private IList RText = new List(); private IList RValue = new List(); private GridColumnCollection gc; private String strWhere = string.Empty; private String colStr = String.Empty; private DataTable dtSelect; private DataTable dtData; public FrmMain() { InitializeComponent(); gvMain.CustomDrawRowIndicator += new RowIndicatorCustomDrawEventHandler(gvMain_CustomDrawRowIndicator); gvMain.RowCellClick += new RowCellClickEventHandler(gvMain_RowCellClick); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (WinHeight > 0) { this.Height = WinHeight; } if (WinWidth > 0) { this.Width = WinWidth; } if (!string.IsNullOrEmpty(FrmTitle)) { this.Text = FrmTitle; } if (!string.IsNullOrEmpty(ReturnText)) { RText = ReturnText.Split(',').ToList(); } if (!string.IsNullOrEmpty(ReturnValue)) { RValue = ReturnValue.Split(',').ToList(); } dtData = SqlHelper.ExecuteDataSet(SQL).Tables[0]; //绑定列z SetColumns(dtData); //绑定选中列 SetColumns2(dtData); //绑定数据源 gridMain.DataSource = dtData; dtSelect = new DataTable(); dtSelect.Columns.Clear(); DataColumn dc2 = new DataColumn() { Caption = "选择", DataType = typeof(bool), ColumnName = "Id", DefaultValue = false }; dtSelect.Columns.Add(dc2); foreach (var col in Columns.Keys) { DataColumn dc = new DataColumn() { Caption = Columns[col], DataType = typeof(String), ColumnName = col, DefaultValue = "" }; dtSelect.Columns.Add(col); } gc = new GridColumnCollection(null); colStr = ""; strWhere = ""; for (int i = 0; i < gvMain.Columns.Count; i++) { if (gvMain.Columns[i].Caption == "选择") continue; gc.Add(gvMain.Columns[i]); if (i == gvMain.Columns.Count - 1) { if (ValueField.ToUpper() == gvMain.Columns[i].FieldName.ToUpper()) { strWhere += gvMain.Columns[i].FieldName + " like '%{0}%' "; } else { strWhere += "dbo.p_getpy(" + gvMain.Columns[i].FieldName + ") like '%{0}%' or "; strWhere += gvMain.Columns[i].FieldName + " like '%{0}%' "; } } else { if (ValueField.ToUpper() == gvMain.Columns[i].FieldName.ToUpper()) { strWhere += gvMain.Columns[i].FieldName + " like '%{0}%' or "; } else { strWhere += "dbo.p_getpy(" + gvMain.Columns[i].FieldName + ") like '%{0}%' or "; strWhere += gvMain.Columns[i].FieldName + " like '%{0}%' or "; } } colStr += gvMain.Columns[i].Caption + "、"; } colStr = "请输入" + colStr.Trim('、'); txtKey.Text = colStr; gvMain.IndicatorWidth = 35; if (!IsMultiple) { int result = gvMain.LocateByValue(TextField, ReturnText, null); if (result >= 0) { gvMain.SelectRow(result); } } else { selectTextValue(); } if (IsMultiple) { gbDetail.Visible = true; btnDelete.Visible = true; gridMain.ContextMenuStrip = contextMenuStrip1; } else { gbDetail.Visible = false; btnDelete.Visible = false; } } public void selectTextValue() { dtSelect.Clear(); if (IsText == 13) { for (int i = 0; i < RValue.Count; i++) { foreach (DataRow row in dtData.Rows) { if (row[ValueField].ToString().Equals(RValue[i])) { if (row.RowState != DataRowState.Deleted) { row["Id"] = true; row.AcceptChanges(); dtSelect.ImportRow(row); } } } } } else { for (int i = 0; i < RText.Count; i++) { int result = gvMain.LocateByValue(TextField, RText[i], null); if (result >= 0) { DataRow dr = gvMain.GetDataRow(result); if (dr.RowState != DataRowState.Deleted) { dr["Id"] = true; dr.AcceptChanges(); dtSelect.ImportRow(dr); } } } } gcSelect.DataSource = dtSelect; } /// /// 生成行号 /// /// /// private void gvMain_CustomDrawRowIndicator(object sender, RowIndicatorCustomDrawEventArgs e) { e.Appearance.TextOptions.HAlignment = HorzAlignment.Center; if (e.Info.IsRowIndicator) { if (e.RowHandle >= 0) { e.Info.DisplayText = (e.RowHandle + 1).ToString(); } } } /// /// 设置grid 列 /// public void SetColumns(DataTable dt) { gvMain.Columns.Clear(); if (IsMultiple) { DataColumn dc = new DataColumn() { Caption = "选择", DataType = typeof(bool), ColumnName = "Id", DefaultValue = false }; dt.Columns.Add(dc); dt.AcceptChanges(); GridColumn gridColumnCheckBox = new GridColumn(); gridColumnCheckBox.FieldName = "Id"; gridColumnCheckBox.Name = "Id"; gridColumnCheckBox.Caption = "选择"; gridColumnCheckBox.Width = 40; gridColumnCheckBox.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; gridColumnCheckBox.Visible = true; gvMain.Columns.Add(gridColumnCheckBox); } foreach (var col in Columns.Keys) { GridColumn gridColumn = new GridColumn(); gridColumn.FieldName = col.ToLower(); gridColumn.Name = col.ToLower(); gridColumn.Caption = Columns[col]; gridColumn.Width = 200; gridColumn.Visible = true; gridColumn.OptionsColumn.AllowEdit = false; gridColumn.OptionsColumn.ReadOnly = false; gvMain.Columns.Add(gridColumn); gvMain.Appearance.HeaderPanel.TextOptions.HAlignment = HorzAlignment.Center; } } /// /// 设置grid 列 /// public void SetColumns2(DataTable dt) { gvSelect.Columns.Clear(); foreach (var col in Columns.Keys) { GridColumn gridColumn = new GridColumn(); gridColumn.FieldName = col; gridColumn.Name = col; gridColumn.Caption = Columns[col]; gridColumn.Width = 200; gridColumn.Visible = true; gridColumn.OptionsColumn.AllowEdit = false; gridColumn.OptionsColumn.ReadOnly = false; gvSelect.Columns.Add(gridColumn); gvSelect.Appearance.HeaderPanel.TextOptions.HAlignment = HorzAlignment.Center; } } /// /// 行点击事件 /// /// /// private void gvMain_RowCellClick(object sender, RowCellClickEventArgs e) { if (IsMultiple) { if (e.Button == MouseButtons.Left) { DataRow row = gvMain.GetDataRow(e.RowHandle); string id = row["Id"] + ""; if (id.IndexOf("true", StringComparison.OrdinalIgnoreCase) != -1) { row["Id"] = false; //删除不需要再进行判断定位 //if (gvSelect.LocateByValue(ValueField, row[ValueField], null) >= 0) //{ for (int i = 0; i < dtSelect.Rows.Count; i++) { DataRow dr = dtSelect.Rows[i]; if (dr.RowState != DataRowState.Deleted) { if (dr[ValueField] + "" == row[ValueField] + "") { dr.Delete(); } } } gcSelect.DataSource = dtSelect; // } } else { row["Id"] = true; if (gvSelect.LocateByValue(ValueField, row[ValueField], null) >= 0) { DialogResult dgRlt = XtraMessageBox.Show("抱歉,已经存在?", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { dtSelect.ImportRow(row); gcSelect.DataSource = dtSelect; } } } } } /// /// 搜索数据 /// /// /// private void btnSearch_Click(object sender, EventArgs e) { if (!string.IsNullOrEmpty(strWhere)) { RValue.Clear(); RText.Clear(); foreach (DataRow row in dtSelect.Rows) { if (row.RowState != DataRowState.Deleted) { RValue.Add(row[ValueField] + ""); RText.Add(row[TextField] + ""); } } string mysql = String.Format("select * from (" + SQL + ") as tab where " + strWhere, txtKey.Text.Replace(colStr, "")); DataTable dt = SqlHelper.ExecuteDataSet(mysql).Tables[0]; SetColumns(dt); gridMain.DataSource = dt; selectTextValue(); } } /// /// 关闭窗口 /// /// /// private void btnClose_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.No; } /// /// 确定-关闭 /// /// /// private void btnSave_Click(object sender, EventArgs e) { if (IsMultiple) { ReturnValue = ""; ReturnText = ""; foreach (DataRow row in dtSelect.Rows) { if (row.RowState != DataRowState.Deleted) { ReturnValue += row[ValueField] + ","; ReturnText += row[TextField] + ","; } } } else { int[] rows = gvMain.GetSelectedRows(); if (rows.Length > 0) { DataRow row = gvMain.GetDataRow(rows[0]); ReturnValue += "'" + row[ValueField] + "',"; ReturnText += row[TextField] + ","; } } if (!string.IsNullOrEmpty(ReturnValue)) { ReturnValue = ReturnValue.Trim(','); } if (!string.IsNullOrEmpty(ReturnText)) { ReturnText = ReturnText.Trim(','); } this.DialogResult = DialogResult.OK; } private void txtKey_KeyDown(object sender, KeyEventArgs e) { if (colStr.Equals(txtKey.Text)) { txtKey.Text = ""; } } private void txtKey_Leave(object sender, EventArgs e) { if (txtKey.Text == "") { txtKey.Text = colStr; } } private void txtKey_Enter(object sender, EventArgs e) { if (colStr.Equals(txtKey.Text)) { txtKey.Text = ""; } } private void btnDelete_Click(object sender, EventArgs e) { int[] rows = gvSelect.GetSelectedRows(); if (rows.Length < 1) return; int currentRow = rows[0]; if (currentRow > 0) currentRow = currentRow - 1; DataRow row = null; foreach (int irow in rows) { row = gvSelect.GetDataRow(irow); int mrow = gvMain.LocateByValue(TextField, row[TextField], null); if (mrow >= 0) { DataRow row1 = gvMain.GetDataRow(mrow); row1["id"] = false; } } gvSelect.DeleteSelectedRows(); gvSelect.SelectRows(currentRow, currentRow); } private void 全部选中ToolStripMenuItem_Click(object sender, EventArgs e) { foreach (DataRow row in dtData.Rows) { if (row.RowState != DataRowState.Deleted) { if (Convert.ToBoolean(row["Id"]) == false) { row["Id"] = true; row.AcceptChanges(); dtSelect.ImportRow(row); } } } } private void 全部取消ToolStripMenuItem_Click(object sender, EventArgs e) { foreach (DataRow row in dtData.Rows) { if (row.RowState != DataRowState.Deleted) { if (Convert.ToBoolean(row["Id"]) == true) { row["Id"] = false; row.AcceptChanges(); } } } gvSelect.SelectAll(); gvSelect.DeleteSelectedRows(); } private void 反向选择ToolStripMenuItem_Click(object sender, EventArgs e) { foreach (DataRow row in dtData.Rows) { if (row.RowState != DataRowState.Deleted) { if (Convert.ToBoolean(row["Id"]) == true) { row["Id"] = false; row.AcceptChanges(); int tmpRowHandle = gvSelect.LocateByValue(TextField, row[TextField], null); if (tmpRowHandle >= 0) { gvSelect.DeleteRow(tmpRowHandle); } } else { row["Id"] = true; row.AcceptChanges(); dtSelect.ImportRow(row); } } } } } }