using System; using System.ComponentModel; using System.ComponentModel.Design; using System.Data; using System.Drawing; using System.Reflection; using System.Windows.Forms; namespace DPumpHydr.WinFrmUI.WenSkin.Controls { [Designer(typeof(Design.Designer.WenDataTextBoxDesigner))] public class WenDataTextBox : WenControl { public WenDataTextBox() : base() { Size = new Size(300, 300); button = new WenButton("确定") { Location = new Point(238, 270), Size = new Size(60, 28), Anchor = AnchorStyles.Bottom | AnchorStyles.Right, BorderStyle = WenButton.WenButtonBorderStyle.RoRectangle, }; button.Click += (s, e) => { OnButtonClick(e); }; flow = new FlowLayoutPanel() { Location = new Point(1, 1), Size = new Size(298, 298), Anchor = AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Left, AutoScroll = true, }; this.Controls.Add(button); this.Controls.Add(flow); } #region 私有属性 private FlowLayoutPanel flow; private WenButton button; private object dataSource; private WenDataTextBoxColumnTextCollection items; #endregion #region 公有属性 //绑定数据 [Browsable(false)] public object DataSource { get => dataSource; set { dataSource = value; switch (value) { case DataRow dw: DataBind(dw); break; case DataTable dt: DataBind(dt.Rows[0]); break; } } } [Category("Wen"), Description("获取或设置输入框列数据"), DefaultValue(null)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] [Editor(typeof(Design.Editor.WenCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))] [EditorBrowsable(EditorBrowsableState.Always)] public WenDataTextBoxColumnTextCollection Items => items ?? (items = new WenDataTextBoxColumnTextCollection(this)); #region WenSql [Category("WenSql"), Description("获取或设置数据库名称"), DefaultValue(null)] public string DataTabaleName { get; set; } [Category("WenSql"), Description("获取插入数据库数据语句"), DefaultValue(null)] [Browsable(false)] public string InsertSqlString { get { string insertName = ""; string insertValue = ""; foreach (WenDataTextBoxColumnText ct in Items) { if (!ct.Updater) continue; insertName += ct.ColumnName + ","; insertValue += $"'{ct.Text}',"; } insertName = insertName.Remove(insertName.Length - 1); insertValue = insertValue.Remove(insertValue.Length - 1); string sql = $"insert into {DataTabaleName} ({insertName}) Values({insertValue})"; return sql; } } [Category("WenSql"), Description("获取更新数据库数据语句"), DefaultValue(null)] [Browsable(false)] public string UpdateSqlString { get { string setValue = ""; WenDataTextBoxColumnText identityCloumn = null; foreach (WenDataTextBoxColumnText ct in Items) { if (ct.Identity) { identityCloumn = ct; continue; } if (!ct.Updater) continue; setValue += $"{ct.ColumnName}=N'{ct.Text}',"; } setValue = setValue.Remove(setValue.Length - 1); //获取主键列 if (identityCloumn == null) return null; string whereValue = identityCloumn.Text.ToString(); string sql = $"update {DataTabaleName} set {setValue} where {identityCloumn.ColumnName}='{whereValue}'"; return sql; } } #endregion #endregion #region 委托 [Category("Wen"), Description("确定按钮点击事件")] public event EventHandler ButtonClick; protected virtual void OnButtonClick(EventArgs e) { foreach (WenDataTextBoxColumnText ct in Items) { if (ct.AutoUpdaterDateTime) { ct.Text = DateTime.Now.ToString(); } } ButtonClick?.Invoke(this, e); } #endregion private void DataBind(DataRow dw) { foreach (DataColumn column in dw.Table.Columns) { WenDataTextBoxColumnText cloumnText = Items[column.ColumnName]; if (cloumnText != null) cloumnText.WenChoiceTextBox.Text = dw[column]?.ToString(); } } #region 重绘 protected override void WenOnPaint(Graphics g, Rectangle rec, PaintEventArgs e) { base.WenOnPaint(g, rec, e); using Pen pen = new Pen(Color.White); g.DrawRectangle(pen, 0, 0, this.Width - 1, this.Height - 1); } #endregion #region 子类 [ToolboxItem(false)] [DefaultProperty("TextLable")] [DesignTimeVisible(false)] public class WenDataTextBoxColumnText:Component { public WenDataTextBoxColumnText() { ReadOnly = false; Visible = true; Identity = false; Updater = true; AutoUpdaterDateTime = false; } public WenDataTextBoxColumnText(string text) : this() { TextLable = text; } #region 私有属性 private bool identity; private string textLable; private string text; private bool readOnly; #endregion #region 公有属性 [Browsable(false)] public string Name { get; set; } [Category("WenInfo"), Description("显示文本"), DefaultValue(null)] public string Text { get => text; set { text = value; if (WenChoiceTextBox != null) WenChoiceTextBox.Text = value; } } [Category("WenInfo"), Description("数据列"), DefaultValue(null)] public string ColumnName { get; set; } [Category("WenInfo"), Description("数据列文本"), DefaultValue(null)] public string TextLable { get => textLable; set { textLable = value; if (WenChoiceTextBox != null) WenChoiceTextBox.TextLable = value; } } [Category("Wen设计"), Description("是否不允许编辑"), DefaultValue(false)] public bool ReadOnly { get => readOnly; set { readOnly = value; if (WenChoiceTextBox != null) WenChoiceTextBox.ReadOnly = value; } } [Category("Wen设计"), Description("是否显示"), DefaultValue(true)] public bool Visible { get; set; } [Category("Wen设计"), Description("是否主键"), DefaultValue(false)] public bool Identity { get => identity; set { identity = value; if (value) { Updater = false; ReadOnly = true; } } } [Category("Wen设计"), Description("是否更新"), DefaultValue(true)] public bool Updater { get; set; } [Category("Wen设计"), Description("点击确定自动将内容更新为当前时间"), DefaultValue(false)] public bool AutoUpdaterDateTime { get; set; } [Browsable(false)] public WenLableTextBox WenChoiceTextBox { get; set; } #endregion public override string ToString() { return $"{ColumnName}[{TextLable}]"; } } public class WenDataTextBoxColumnTextCollection : WenCollection { public WenDataTextBoxColumnTextCollection(WenDataTextBox owner) { this.owner = owner; } public WenDataTextBoxColumnText this[int index] { get => Items[index] as WenDataTextBoxColumnText; set => Items[index] = value; } public WenDataTextBoxColumnText this[string str] { get { foreach (var item in Items) { if (item is WenDataTextBoxColumnText cloumnText) { if (cloumnText.ColumnName?.ToUpper() == str.ToUpper()) return cloumnText; } } return null; } } #region 私有属性 private WenDataTextBox owner { get; set; } #endregion public override int Add(object value) { if (value is WenDataTextBoxColumnText columnText) { WenLableTextBox textBox = new WenLableTextBox() { TextLable = columnText.TextLable, ReadOnly = columnText.ReadOnly, Visible = columnText.Visible, Width = 260, }; textBox.TextChanged += (s, e) => { columnText.Text = textBox.Text; if (owner.dataSource is DataRow dw) { try { //Type type = dw.Table.Columns[columnText.ColumnName].DataType; //dw[columnText.ColumnName] = new TypeConverter().ConvertTo(textBox.Text, type); dw[columnText.ColumnName] = textBox.Text; } catch { } } }; columnText.WenChoiceTextBox = textBox; owner.flow.Controls.Add(textBox); } return base.Add(value); } public override void Clear() { base.Clear(); owner.flow.Controls.Clear(); } } #endregion } }