+ UIComboBox:增加数据绑定,可设置DataSource,DisplayMember,ValueMember

This commit is contained in:
Sunny 2020-06-12 20:17:55 +08:00
parent 3df0e10b65
commit 04f3640217
8 changed files with 164 additions and 221 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -182,7 +182,6 @@
// uiComboBox2 // uiComboBox2
// //
this.uiComboBox2.DropDownStyle = Sunny.UI.UIDropDownStyle.DropDownList; this.uiComboBox2.DropDownStyle = Sunny.UI.UIDropDownStyle.DropDownList;
this.uiComboBox2.DropDownWidth = 0;
this.uiComboBox2.FillColor = System.Drawing.Color.White; this.uiComboBox2.FillColor = System.Drawing.Color.White;
this.uiComboBox2.Font = new System.Drawing.Font("微软雅黑", 12F); this.uiComboBox2.Font = new System.Drawing.Font("微软雅黑", 12F);
this.uiComboBox2.Items.AddRange(new object[] { this.uiComboBox2.Items.AddRange(new object[] {
@ -203,7 +202,6 @@
// //
// uiComboBox1 // uiComboBox1
// //
this.uiComboBox1.DropDownWidth = 0;
this.uiComboBox1.FillColor = System.Drawing.Color.White; this.uiComboBox1.FillColor = System.Drawing.Color.White;
this.uiComboBox1.Font = new System.Drawing.Font("微软雅黑", 12F); this.uiComboBox1.Font = new System.Drawing.Font("微软雅黑", 12F);
this.uiComboBox1.Items.AddRange(new object[] { this.uiComboBox1.Items.AddRange(new object[] {

View File

@ -96,7 +96,7 @@ namespace Sunny.UI
{ {
dropSymbol = SymbolNormal; dropSymbol = SymbolNormal;
if (itemForm != null && itemForm.Visible) if (DroppedDown)
{ {
dropSymbol = SymbolDropDown; dropSymbol = SymbolDropDown;
} }
@ -105,7 +105,7 @@ namespace Sunny.UI
} }
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool DroppedDown=> itemForm != null && itemForm.Visible; public bool DroppedDown => itemForm != null && itemForm.Visible;
private int symbolNormal = 61703; private int symbolNormal = 61703;
private int dropSymbol = 61703; private int dropSymbol = 61703;
@ -159,7 +159,7 @@ namespace Sunny.UI
public event EventHandler ButtonClick; public event EventHandler ButtonClick;
private readonly TextBoxEx edit = new TextBoxEx(); protected readonly TextBoxEx edit = new TextBoxEx();
protected override void OnTextChanged(EventArgs e) protected override void OnTextChanged(EventArgs e)
{ {
@ -270,14 +270,14 @@ namespace Sunny.UI
set => edit.MaxLength = Math.Max(value, 1); set => edit.MaxLength = Math.Max(value, 1);
} }
[Browsable(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int SelectionLength public int SelectionLength
{ {
get => edit.SelectionLength; get => edit.SelectionLength;
set => edit.SelectionLength = value; set => edit.SelectionLength = value;
} }
[ Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) ] [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int SelectionStart public int SelectionStart
{ {
get => edit.SelectionStart; get => edit.SelectionStart;
@ -336,7 +336,7 @@ namespace Sunny.UI
edit.SelectAll(); edit.SelectAll();
} }
private class TextBoxEx : TextBox protected class TextBoxEx : TextBox
{ {
private string watermark; private string watermark;

View File

@ -17,7 +17,7 @@
* : 2020-01-01 * : 2020-01-01
* *
* 2020-01-01: V2.2.0 * 2020-01-01: V2.2.0
* 2020-06-11: V2.2.5 DataSource * 2020-06-11: V2.2.5 DataSource
******************************************************************************/ ******************************************************************************/
using System; using System;
@ -40,21 +40,9 @@ namespace Sunny.UI
InitializeComponent(); InitializeComponent();
box.SelectedIndexChanged += Box_SelectedIndexChanged; box.SelectedIndexChanged += Box_SelectedIndexChanged;
box.SelectionChangeCommitted += Box_SelectionChangeCommitted;
box.TextUpdate += Box_TextUpdate;
box.DataSourceChanged += Box_DataSourceChanged; box.DataSourceChanged += Box_DataSourceChanged;
box.DisplayMemberChanged += Box_DisplayMemberChanged; box.DisplayMemberChanged += Box_DisplayMemberChanged;
box.Format += Box_Format;
box.FormatInfoChanged += Box_FormatInfoChanged;
box.FormatStringChanged += Box_FormatStringChanged;
box.FormattingEnabledChanged += Box_FormattingEnabledChanged;
box.ValueMemberChanged += Box_ValueMemberChanged; box.ValueMemberChanged += Box_ValueMemberChanged;
box.SelectedValueChanged += Box_SelectedValueChanged;
}
private void Box_SelectedValueChanged(object sender, EventArgs e)
{
SelectedValueChanged?.Invoke(sender, e);
} }
private void Box_ValueMemberChanged(object sender, EventArgs e) private void Box_ValueMemberChanged(object sender, EventArgs e)
@ -62,26 +50,6 @@ namespace Sunny.UI
ValueMemberChanged?.Invoke(sender, e); ValueMemberChanged?.Invoke(sender, e);
} }
private void Box_FormattingEnabledChanged(object sender, EventArgs e)
{
FormattingEnabledChanged?.Invoke(sender, e);
}
private void Box_FormatStringChanged(object sender, EventArgs e)
{
FormatStringChanged?.Invoke(sender, e);
}
private void Box_FormatInfoChanged(object sender, EventArgs e)
{
FormatInfoChanged?.Invoke(sender, e);
}
private void Box_Format(object sender, ListControlConvertEventArgs e)
{
Format?.Invoke(sender, e);
}
private void Box_DisplayMemberChanged(object sender, EventArgs e) private void Box_DisplayMemberChanged(object sender, EventArgs e)
{ {
DisplayMemberChanged?.Invoke(sender, e); DisplayMemberChanged?.Invoke(sender, e);
@ -92,72 +60,48 @@ namespace Sunny.UI
DataSourceChanged?.Invoke(sender, e); DataSourceChanged?.Invoke(sender, e);
} }
private void Box_TextUpdate(object sender, EventArgs e)
{
TextUpdate?.Invoke(sender, e);
}
private void Box_SelectionChangeCommitted(object sender, EventArgs e)
{
SelectionChangeCommitted?.Invoke(sender, e);
}
private void Box_SelectedIndexChanged(object sender, EventArgs e) private void Box_SelectedIndexChanged(object sender, EventArgs e)
{ {
Text = box.GetItemText(box.SelectedItem);
GetSelectedValue();
SelectedValueChanged?.Invoke(this, e);
SelectedIndexChanged?.Invoke(sender, e); SelectedIndexChanged?.Invoke(sender, e);
} }
public event EventHandler TextUpdate;
public event EventHandler SelectedIndexChanged; public event EventHandler SelectedIndexChanged;
public event EventHandler SelectionChangeCommitted;
public event EventHandler DataSourceChanged; public event EventHandler DataSourceChanged;
public event EventHandler DisplayMemberChanged; public event EventHandler DisplayMemberChanged;
public event ListControlConvertEventHandler Format;
public event EventHandler FormatStringChanged;
public event EventHandler FormattingEnabledChanged;
public event EventHandler ValueMemberChanged; public event EventHandler ValueMemberChanged;
public event EventHandler SelectedValueChanged; public event EventHandler SelectedValueChanged;
[Browsable(false), EditorBrowsable(EditorBrowsableState.Advanced)] public readonly ComboBox box = new ComboBox();
public event EventHandler FormatInfoChanged;
private readonly ComboBox box = new ComboBox();
protected override void ItemForm_ValueChanged(object sender, object value) protected override void ItemForm_ValueChanged(object sender, object value)
{ {
//selectedItem = ListBox.SelectedItem; SelectedIndex = ListBox.SelectedIndex;
//selectedIndex = ListBox.SelectedIndex;
box.SelectedIndex = ListBox.SelectedIndex;
Text = ListBox.Text;
Invalidate(); Invalidate();
//SelectedIndexChanged?.Invoke(this, null);
} }
private readonly UIComboBoxItem item = new UIComboBoxItem(); private readonly UIComboBoxItem dropForm = new UIComboBoxItem();
protected override void CreateInstance() protected override void CreateInstance()
{ {
ItemForm = new UIDropDown(item); ItemForm = new UIDropDown(dropForm);
} }
protected override int CalcItemFormHeight() protected override int CalcItemFormHeight()
{ {
int interval = ItemForm.Height - ItemForm.ClientRectangle.Height; int interval = ItemForm.Height - ItemForm.ClientRectangle.Height;
return 4 + Math.Min(Items.Count, MaxDropDownItems) * ItemHeight + interval; return 4 + Math.Min(ListBox.Items.Count, MaxDropDownItems) * ItemHeight + interval;
} }
private UIListBox ListBox private UIListBox ListBox
{ {
get => item.ListBox; get => dropForm.ListBox;
} }
[DefaultValue(25)] [DefaultValue(25)]
@ -170,12 +114,6 @@ namespace Sunny.UI
[DefaultValue(8)] [DefaultValue(8)]
public int MaxDropDownItems { get; set; } = 8; public int MaxDropDownItems { get; set; } = 8;
//[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
//[Localizable(true)]
//[Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
//[MergableProperty(false)]
//public ListBox.ObjectCollection Items => ListBox?.Items;
private void UIComboBox_FontChanged(object sender, EventArgs e) private void UIComboBox_FontChanged(object sender, EventArgs e)
{ {
if (ItemForm != null) if (ItemForm != null)
@ -186,16 +124,15 @@ namespace Sunny.UI
private void UIComboBox_ButtonClick(object sender, EventArgs e) private void UIComboBox_ButtonClick(object sender, EventArgs e)
{ {
ListBox.Items.Clear();
if (Items.Count == 0 || ItemForm.Visible) if (Items.Count == 0 || ItemForm.Visible)
{ {
return; return;
} }
ListBox.Items.Clear(); foreach (var data in Items)
foreach (var item in Items)
{ {
ListBox.Items.Add(GetItemText(item)); ListBox.Items.Add(GetItemText(data));
} }
ListBox.SelectedIndex = SelectedIndex; ListBox.SelectedIndex = SelectedIndex;
@ -210,52 +147,58 @@ namespace Sunny.UI
ListBox.SetStyleColor(uiColor); ListBox.SetStyleColor(uiColor);
} }
[ private object dataSource;
DefaultValue(AutoCompleteMode.None),
Browsable(true), EditorBrowsable(EditorBrowsableState.Always)
]
public AutoCompleteMode AutoCompleteMode
{
get => box.AutoCompleteMode;
set => box.AutoCompleteMode = value;
}
[
DefaultValue(AutoCompleteSource.None),
Browsable(true), EditorBrowsable(EditorBrowsableState.Always)
]
public AutoCompleteSource AutoCompleteSource
{
get => box.AutoCompleteSource;
set => box.AutoCompleteSource = value;
}
[Browsable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
[EditorBrowsable(EditorBrowsableState.Always)]
[Localizable(true)]
public AutoCompleteStringCollection AutoCompleteCustomSource
{
get => box.AutoCompleteCustomSource;
set => box.AutoCompleteCustomSource = value;
}
[DefaultValue(null), RefreshProperties(RefreshProperties.Repaint), AttributeProvider(typeof(IListSource))] [DefaultValue(null), RefreshProperties(RefreshProperties.Repaint), AttributeProvider(typeof(IListSource))]
public object DataSource public object DataSource
{ {
get => box.DataSource; get => dataSource;
set => box.DataSource = value; set
{
SetDataConnection(value, new BindingMemberInfo(DisplayMember));
dataSource = value;
box.Items.Clear();
foreach (var obj in dataManager.List)
{
box.Items.Add(obj);
}
}
} }
[DefaultValue(DrawMode.Normal), RefreshProperties(RefreshProperties.Repaint)] private bool inSetDataConnection;
public DrawMode DrawMode private CurrencyManager dataManager;
private void SetDataConnection(object newDataSource, BindingMemberInfo newDisplayMember)
{ {
get => box.DrawMode; bool dataSourceChanged = dataSource != newDataSource;
set => box.DrawMode = value; bool displayMemberChanged = !DisplayMember.Equals(newDisplayMember.BindingPath);
if (inSetDataConnection)
{
return;
}
try
{
if (dataSourceChanged || displayMemberChanged)
{
CurrencyManager newDataManager = null;
if (newDataSource != null && newDataSource != Convert.DBNull)
{
newDataManager = (CurrencyManager)BindingContext[newDataSource, newDisplayMember.BindingPath];
}
dataManager = newDataManager;
}
}
finally
{
inSetDataConnection = false;
}
} }
public int DropDownWidth { get; set; } //public int DropDownWidth { get; set; }
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))] [Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
@ -283,50 +226,22 @@ namespace Sunny.UI
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public string SelectedText public string SelectedText
{ {
get => box.SelectedText; get
set => box.SelectedText = value; {
} if (DropDownStyle == UIDropDownStyle.DropDown)
{
[DefaultValue(false)] return edit.SelectedText;
public bool Sorted }
{ else
get => box.Sorted; {
set => box.Sorted = value; return Text;
} }
}
public void BeginUpdate()
{
box.BeginUpdate();
}
public void EndUpdate()
{
box.EndUpdate();
}
public int FindString(string s)
{
return box.FindString(s, -1);
}
public int FindString(string s, int startIndex)
{
return box.FindString(s, startIndex);
}
public int FindStringExact(string s)
{
return box.FindStringExact(s);
}
public int FindStringExact(string s, int startIndex)
{
return box.FindStringExact(s, startIndex);
} }
public override void ResetText() public override void ResetText()
{ {
box.ResetText(); Clear();
} }
[DefaultValue("")] [DefaultValue("")]
@ -335,24 +250,17 @@ namespace Sunny.UI
public string DisplayMember public string DisplayMember
{ {
get => box.DisplayMember; get => box.DisplayMember;
set => box.DisplayMember = value; set
{
SetDataConnection(dataSource, new BindingMemberInfo(value));
box.DisplayMember = value;
}
} }
[
Browsable(false),
EditorBrowsable(EditorBrowsableState.Advanced),
DefaultValue(null)
]
public IFormatProvider FormatInfo
{
get => box.FormatInfo;
set => box.FormatInfo = value;
}
[DefaultValue("")] [DefaultValue("")]
[Editor("System.Windows.Forms.Design.FormatStringEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))] [Editor("System.Windows.Forms.Design.FormatStringEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
[MergableProperty(false)] [MergableProperty(false)]
/// <include file='doc\ListControl.uex' path='docs/doc[@for="ListControl.FormatString"]/*' />
public string FormatString public string FormatString
{ {
get => box.FormatString; get => box.FormatString;
@ -374,61 +282,95 @@ namespace Sunny.UI
set => box.ValueMember = value; set => box.ValueMember = value;
} }
private object selectedValue;
private void GetSelectedValue()
{
if (SelectedIndex != -1 && dataManager != null)
{
selectedValue = FilterItemOnProperty(SelectedItem, ValueMember);
}
else
{
selectedValue = null;
}
}
[ [
DefaultValue(null), DefaultValue(null),
Browsable(false), Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
Bindable(true) Bindable(true)
] ]
public object SelectedValue public object SelectedValue
{ {
get => box.SelectedValue; get
set => box.SelectedValue = value; {
GetSelectedValue();
return selectedValue;
}
set
{
selectedValue = value;
if (value == null)
{
return;
}
if (dataManager != null)
{
int index = DataManagerFind(value);
SelectedIndex = index;
}
}
}
private int DataManagerFind(object value)
{
if (dataManager == null) return -1;
for (int i = 0; i < dataManager.List.Count; i++)
{
var item = dataManager.List[i];
if (FilterItemOnProperty(item, ValueMember).Equals(value))
{
return i;
}
}
return -1;
}
private object FilterItemOnProperty(object item, string field)
{
if (item != null && field.Length > 0)
{
try
{
// if we have a dataSource, then use that to display the string
PropertyDescriptor descriptor;
if (dataManager != null)
descriptor = dataManager.GetItemProperties().Find(field, true);
else
descriptor = TypeDescriptor.GetProperties(item).Find(field, true);
if (descriptor != null)
{
item = descriptor.GetValue(item);
}
}
catch
{
return null;
}
}
return item;
} }
public string GetItemText(object item) public string GetItemText(object item)
{ {
return box.GetItemText(item); return box.GetItemText(item);
} }
//private int selectedIndex = -1;
//[Browsable(false)]
//[DefaultValue(-1)]
//public int SelectedIndex
//{
// get => selectedIndex;
// set
// {
// if (value.InRange(-1, ListBox.Items.Count - 1))
// {
// ListBox.SelectedIndex = value;
// selectedIndex = value;
// if (value >= 0)
// {
// Text = ListBox.Items[value].ToString();
// }
// }
// }
//}
//private object selectedItem;
//[Browsable(false)]
//[DefaultValue(null)]
//public object SelectedItem
//{
// get => selectedItem;
// set
// {
// if (value != null)
// {
// int idx = ListBox.Items.IndexOf(value);
// SelectedIndex = idx;
// selectedItem = idx >= 0 ? value : null;
// }
// }
//}
} }
} }

View File

@ -1,5 +1,8 @@
+ 增加; - 删除; * 修改 + 增加; - 删除; * 修改
2020.06.12
+ UIComboBox增加数据绑定可设置DataSourceDisplayMemberValueMember
2020.06.11 2020.06.11
+ 增加到Nuget + 增加到Nuget
* UIFrame修复框架页面放置UIContextMenuStrip时显示错位 * UIFrame修复框架页面放置UIContextMenuStrip时显示错位