* UIComboBox: 根据Text自动选中SelectIndex

This commit is contained in:
Sunny 2022-04-13 19:06:28 +08:00
parent 01ce6f5eaf
commit a42cd389fc

View File

@ -23,9 +23,11 @@
* 2021-08-03: V3.0.5 Items.Clear后清除显示 * 2021-08-03: V3.0.5 Items.Clear后清除显示
* 2021-08-15: V3.0.6 * 2021-08-15: V3.0.6
* 2022-01-16: V3.1.0 * 2022-01-16: V3.1.0
* 2022-04-13: V3.1.3 Text自动选中SelectIndex
******************************************************************************/ ******************************************************************************/
using System; using System;
using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Drawing; using System.Drawing;
using System.Drawing.Design; using System.Drawing.Design;
@ -43,8 +45,8 @@ namespace Sunny.UI
{ {
InitializeComponent(); InitializeComponent();
ListBox.SelectedIndexChanged += Box_SelectedIndexChanged; ListBox.SelectedIndexChanged += Box_SelectedIndexChanged;
ListBox.DataSourceChanged += Box_DataSourceChanged; //ListBox.DataSourceChanged += Box_DataSourceChanged;
ListBox.DisplayMemberChanged += Box_DisplayMemberChanged; //ListBox.DisplayMemberChanged += Box_DisplayMemberChanged;
ListBox.ValueMemberChanged += Box_ValueMemberChanged; ListBox.ValueMemberChanged += Box_ValueMemberChanged;
ListBox.SelectedValueChanged += ListBox_SelectedValueChanged; ListBox.SelectedValueChanged += ListBox_SelectedValueChanged;
ListBox.ItemsClear += ListBox_ItemsClear; ListBox.ItemsClear += ListBox_ItemsClear;
@ -54,6 +56,18 @@ namespace Sunny.UI
fullControlSelect = true; fullControlSelect = true;
} }
private void InitStrings()
{
if (DropDownStyle == UIDropDownStyle.DropDown && DataSource != null && DisplayMember.IsValid())
{
strings.Clear();
for (int i = 0; i < Items.Count; i++)
{
strings.Add(GetItemText(Items[i]));
}
}
}
public Control ExToolTipControl() public Control ExToolTipControl()
{ {
return edit; return edit;
@ -106,6 +120,17 @@ namespace Sunny.UI
private void Edit_TextChanged(object sender, EventArgs e) private void Edit_TextChanged(object sender, EventArgs e)
{ {
TextChanged?.Invoke(this, e); TextChanged?.Invoke(this, e);
if (Text.IsValid() && DropDownStyle == UIDropDownStyle.DropDown && !SelectTextChange)
{
if (DataSource == null)
{
SelectedIndex = Items.IndexOf(Text);
}
else
{
SelectedIndex = strings.IndexOf(Text);
}
}
} }
private void ListBox_SelectedValueChanged(object sender, EventArgs e) private void ListBox_SelectedValueChanged(object sender, EventArgs e)
@ -121,16 +146,23 @@ namespace Sunny.UI
private void Box_DisplayMemberChanged(object sender, EventArgs e) private void Box_DisplayMemberChanged(object sender, EventArgs e)
{ {
DisplayMemberChanged?.Invoke(this, e); DisplayMemberChanged?.Invoke(this, e);
InitStrings();
} }
private void Box_DataSourceChanged(object sender, EventArgs e) private void Box_DataSourceChanged(object sender, EventArgs e)
{ {
DataSourceChanged?.Invoke(this, e); DataSourceChanged?.Invoke(this, e);
InitStrings();
} }
private bool SelectTextChange;
private void Box_SelectedIndexChanged(object sender, EventArgs e) private void Box_SelectedIndexChanged(object sender, EventArgs e)
{ {
Text = ListBox.GetItemText(ListBox.SelectedItem); SelectTextChange = true;
if (ListBox.SelectedItem != null)
Text = ListBox.GetItemText(ListBox.SelectedItem);
SelectTextChange = false;
SelectedIndexChanged?.Invoke(this, e); SelectedIndexChanged?.Invoke(this, e);
} }
@ -199,10 +231,14 @@ namespace Sunny.UI
UIComboBox_ButtonClick(this, EventArgs.Empty); UIComboBox_ButtonClick(this, EventArgs.Empty);
} }
List<string> strings = new List<string>();
private void UIComboBox_ButtonClick(object sender, EventArgs e) private void UIComboBox_ButtonClick(object sender, EventArgs e)
{ {
if (Items.Count > 0) if (Items.Count > 0)
{
ItemForm.Show(this, new Size(DropDownWidth < Width ? Width : DropDownWidth, CalcItemFormHeight())); ItemForm.Show(this, new Size(DropDownWidth < Width ? Width : DropDownWidth, CalcItemFormHeight()));
}
} }
public override void SetStyleColor(UIBaseStyle uiColor) public override void SetStyleColor(UIBaseStyle uiColor)
@ -214,7 +250,11 @@ namespace Sunny.UI
public object DataSource public object DataSource
{ {
get => ListBox.DataSource; get => ListBox.DataSource;
set => ListBox.DataSource = value; set
{
ListBox.DataSource = value;
Box_DataSourceChanged(this, EventArgs.Empty);
}
} }
[DefaultValue(150)] [DefaultValue(150)]
@ -273,7 +313,11 @@ namespace Sunny.UI
public string DisplayMember public string DisplayMember
{ {
get => ListBox.DisplayMember; get => ListBox.DisplayMember;
set => ListBox.DisplayMember = value; set
{
ListBox.DisplayMember = value;
Box_DisplayMemberChanged(this, EventArgs.Empty);
}
} }
[Description("获取或设置指示显示值的方式的格式说明符字符。"), Category("SunnyUI")] [Description("获取或设置指示显示值的方式的格式说明符字符。"), Category("SunnyUI")]