/****************************** * 说明:自定义下拉选择框控件 * 创建人:龚宇超 * 创建日期:2017-08-07 * 修改人: * 修改日期: * 修改备注: * 版本:1.0.0.0 ******************************/ using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using DevExpress.XtraEditors; using DevExpress.XtraEditors.Controls; using Lskj.Control.Model; using Lskj.Business.Impl; namespace Lskj.Control { /// /// 自定义下拉选择框 /// public partial class LabelComboxEdit : BaseUserControl { /// /// 数据源 /// private List _sources = new List(); /// /// 绑定ValueMember /// public string ValueMember = string.Empty; /// /// 隐藏值字段 /// public string ValueField = string.Empty; /// /// 显示值字段 /// public string TextField = string.Empty; /// /// 下拉选择框控件 /// public ComboBoxEdit TextEdit { get { return txtEdit; } } /// /// 文本 /// /// The label. public Label Label { get { return lblText; } } /// /// The contro object /// public MyControl ControlObj; /// /// 数据源 /// public string SourceSQL = string.Empty; /// /// 是否带参数 /// public bool Isparameters = false; public LabelComboxEdit() { InitializeComponent(); // 绑定事件 txtEdit.QueryPopUp += TxtEdit_QueryPopUp; } private void TxtEdit_QueryPopUp(object sender, CancelEventArgs e) { this.RefreshData(); } public void RefreshData() { if (Isparameters && !string.IsNullOrWhiteSpace(this.SourceSQL) && this.ControlObj != null) { string oldValue = this.EditValue; string sqlValue = this.ControlObj.ReplaceControlValue(this.SourceSQL); sqlValue = sqlValue.Replace("#", ""); DataTable table = BaseImpl.GetDataTableResult(sqlValue); this.SetDataSource(table, true); this.EditText = oldValue; } } /// /// 说明:设置控件显示文本 /// 创建人:龚宇超 /// 创建日期:2017-08-07 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// 显示Lebel文本 public override string LabelText { get { return this.lblText.Text; } set { this.lblText.Text = value; if (FontSize > 0) { this.plLeft.Dock = DockStyle.Left; this.plLeft.AutoSize = false; this.lblText.AutoSize = false; this.lblText.Dock = System.Windows.Forms.DockStyle.Fill; this.lblText.Location = new System.Drawing.Point(0, 0); this.lblText.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; this.txtEdit.Properties.AutoHeight = false; this.txtEdit.Properties.AppearanceDropDown.Font = this.txtEdit.Properties.Appearance.Font;//下拉框里的字体和选中框中的保持一致 this.plLeft.Width = value.Length * GetCharWidth(); GetCharWidthMultilingual(this.lblText, this.lblText.Text, this.plLeft); } else { this.plLeft.Width = this.lblText.Width + PaddingLeft; } } } /// /// 字体大小 /// /// The size of the control. public override float FontSize { get { return base.FontSize; } set { base.FontSize = value; if (value > 0) { this.lblText.Font = new Font(this.lblText.Font.FontFamily, value); this.TextEdit.Font = new Font(this.TextEdit.Font.FontFamily, value); } } } /// /// 说明:设置控件显示值 /// 创建人:龚宇超 /// 创建日期:2017-08-07 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// public override string EditText { get { return txtEdit.Text; } set { ComboBoxModel item = ValueMember.Equals(ValueField) ? this._sources.FirstOrDefault(x => x.RowItem[x.ValueMember] + "" == value + "") : this._sources.FirstOrDefault(x => x.RowItem[x.DisplayMember] + "" == value + ""); if (item != null) { txtEdit.SelectedItem = item; } else { txtEdit.EditValue = null; } } } /// /// 获取隐藏值 /// /// The edit value. public string EditValue { get { ComboBoxModel model = this.txtEdit.SelectedItem as ComboBoxModel; if (model != null) { return ValueMember.Equals(ValueField) ? model.RowItem[model.ValueMember] + "" : model.RowItem[model.DisplayMember] + ""; } else { return string.Empty; } } } /// /// 说明:设置控件提示文本 /// 创建人:龚宇超 /// 创建日期:2017-08-07 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// 返回控件值 public override string NullText { get { return this.txtEdit.Properties.NullText; } set { this.txtEdit.Properties.NullText = value; } } /// /// 只读文本颜色 /// /// The color of the read only label. public override bool ReadOnly { get { return base.ReadOnly; } set { base.ReadOnly = value; this.txtEdit.Properties.ReadOnly = value; this.lblText.ForeColor = value ? base.ReadOnlyLabelForceColor : Required ? base.RequiredLabelForceColor : base.DefaultLabelForceColor; } } /// /// 必填文本颜色 /// /// The color of the required label. public override bool Required { get { return base.Required; } set { base.Required = value; if (value) { this.lblText.ForeColor = base.RequiredLabelForceColor; } } } /// /// 说明:需要单独验证是否修改 /// 创建人:龚宇超 /// 创建日期:2017-11-08 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// true if this instance is update; otherwise, false. public override bool IsUpdate() { if (Model.FieldType == ControlType.LabComboxValue || Model.FieldType == ControlType.LabAutoCompleteValueParam) { return !this.Model.Text.Equals(this.EditValue, StringComparison.OrdinalIgnoreCase); } else { return base.IsUpdate(); } } /// /// 说明:设置数据源 /// 创建人:龚宇超 /// 创建日期:2017-08-08 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// 数据源 public void SetDataSource(DataTable dataSource) { SetDataSource(dataSource, false); } /// /// 说明:设置数据源 /// /// 数据源 /// 绑定前是否清空原数据源 public void SetDataSource(DataTable dataSource, bool clearBeforeBind) { try { if (clearBeforeBind) { ClearDataSource(); } if (dataSource == null) return; foreach (DataRow item in dataSource.Rows) { ComboBoxModel model = new ComboBoxModel { ValueMember = ValueField, DisplayMember = TextField, RowItem = item }; this._sources.Add(model); this.txtEdit.Properties.Items.Add(model); } } catch (Exception) { } } /// /// 清空下拉数据源和已选项,避免带参数下拉每次弹出重复追加。 /// private void ClearDataSource() { this._sources.Clear(); this.txtEdit.SelectedItem = null; this.txtEdit.EditValue = null; this.txtEdit.Properties.Items.Clear(); } /// /// 背景颜色 /// /// The color of the required label. public override Color BackgroundColor { get { return TextEdit.Properties.Appearance.BackColor; } set { TextEdit.Properties.Appearance.BackColor = value; } } /// /// 前景颜色 /// /// The color of the required label. public override Color ForeColor { get { return TextEdit.Properties.Appearance.ForeColor; } set { TextEdit.Properties.Appearance.ForeColor = value; } } /// /// 内容加粗 /// /// The color of the required label. public override bool ContentBold { get { return TextEdit.Properties.Appearance.Font.Bold; } set { Font oldFont = TextEdit.Properties.Appearance.Font; TextEdit.Properties.Appearance.Font = new Font(oldFont.FontFamily, oldFont.Size, value ? FontStyle.Bold : FontStyle.Regular); } } } class ComboBoxModel { public string ValueMember; public string DisplayMember; public DataRow RowItem; public override string ToString() { return this.RowItem[DisplayMember] + ""; } } }