Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在组合框中存储实际的底层DB值,同时显示更为用户友好的值?_C#_Winforms_Combobox - Fatal编程技术网

C# 如何在组合框中存储实际的底层DB值,同时显示更为用户友好的值?

C# 如何在组合框中存储实际的底层DB值,同时显示更为用户友好的值?,c#,winforms,combobox,C#,Winforms,Combobox,我需要在组合框中显示“秘密地”和“秘密地”等值,但之后可以根据这些单词的基本DB值(例如,“S”和“D”)设置组合框的SelectedItem 我想我可以使用组合框的DisplayMember和ValueMember属性来实现这一点,但我能否随后用实际(ValueMember)值对以下内容进行一些分析: 由于“古怪副词[当前副词]”包含“S”和“D”等值,因此当组合框包含“秘密”和“谨慎”值时,它当然不会找到并设置SelectedIndex 如果我将combobox项标记值设置为“S”和“D”(

我需要在组合框中显示“秘密地”和“秘密地”等值,但之后可以根据这些单词的基本DB值(例如,“S”和“D”)设置组合框的SelectedItem

我想我可以使用组合框的DisplayMember和ValueMember属性来实现这一点,但我能否随后用实际(ValueMember)值对以下内容进行一些分析:

由于“古怪副词[当前副词]”包含“S”和“D”等值,因此当组合框包含“秘密”和“谨慎”值时,它当然不会找到并设置SelectedIndex


如果我将combobox项标记值设置为“S”和“D”(假设这是可能的),我可以循环这些值,但我希望有一种类似于上面的“IndexOf()”的单行方法。组合框将显示您想要的任何文本,您可以用它存储一个值

    public class cboItem<T>
{
    public cboItem(string name, T value)
    {
        this.Name = name;
        this.Value = value;
    }

    public string Name { get; set; }
    public T Value { get; set; }
    public override string ToString()
    {
        return Name == null ? "" : Name;
    }
}
公共类cboItem
{
公共cboItem(字符串名称,T值)
{
this.Name=Name;
这个。值=值;
}
公共字符串名称{get;set;}
公共T值{get;set;}
公共重写字符串ToString()
{
返回名称==null?“:名称;
}
}

我为此使用了一个模板类,它非常方便。组合框将显示您想要的任何文本,您可以用它存储一个值

    public class cboItem<T>
{
    public cboItem(string name, T value)
    {
        this.Name = name;
        this.Value = value;
    }

    public string Name { get; set; }
    public T Value { get; set; }
    public override string ToString()
    {
        return Name == null ? "" : Name;
    }
}
公共类cboItem
{
公共cboItem(字符串名称,T值)
{
this.Name=Name;
这个。值=值;
}
公共字符串名称{get;set;}
公共T值{get;set;}
公共重写字符串ToString()
{
返回名称==null?“:名称;
}
}

组合框项可以是任何内容,包括类/结构。默认情况下,它将使用ToString()实现来显示项目,但如果填充一组对象,则可以使用DisplayMember和ValueMember来显示项目

作为一个简单的示例,我们将组合框绑定到一组KeyValuePair实例,以显示奇怪的动词代码及其描述性名称。或者,您可以使用linq组合匿名类型,或者创建自己合适的类/结构

private void populateCombo()
{
    comboBoxAdverbs.Items.Clear();
    comboBoxAdverbs.Items.Add( new Tuple<string, string>( "S", "Surreptitiously" ) );
    comboBoxAdverbs.Items.Add( new Tuple<string, string>( "D", "Discreetly" ) );
    comboBoxAdverbs.DisplayMember = "Item2";
}
private void populateCombo()
{
Combobox副词.Items.Clear();
combobox副词.Items.Add(新元组(“S”,“秘密”);
combobox副词.Items.Add(新元组(“D”,“谨慎”));
Combobox副词.DisplayMember=“Item2”;
}
然后在代码中选择与提供的代码匹配的项目:(即“D”)

var item=combobox副词.Items
第()类
.FirstOrDefault(i=>string.Compare(i.Item1,textBox1.Text,true)==0);
如果(项!=null)
ComboBox副词。SelectedItem=项;
这将尝试通过将键与任何输入(在本例中为文本框值)进行比较来查找匹配项,如果找到匹配项,则设置SelectedItem以通知组合框选择它


**编辑:Whups,最初使用KeyValuePair,我不知道它是一个结构,所以没有空检查功能。更改为Tuple(基本上是Pair)

组合框项可以是任何内容,包括类/结构。默认情况下,它将使用ToString()实现来显示项目,但如果填充一组对象,则可以使用DisplayMember和ValueMember来显示项目

作为一个简单的示例,我们将组合框绑定到一组KeyValuePair实例,以显示奇怪的动词代码及其描述性名称。或者,您可以使用linq组合匿名类型,或者创建自己合适的类/结构

private void populateCombo()
{
    comboBoxAdverbs.Items.Clear();
    comboBoxAdverbs.Items.Add( new Tuple<string, string>( "S", "Surreptitiously" ) );
    comboBoxAdverbs.Items.Add( new Tuple<string, string>( "D", "Discreetly" ) );
    comboBoxAdverbs.DisplayMember = "Item2";
}
private void populateCombo()
{
Combobox副词.Items.Clear();
combobox副词.Items.Add(新元组(“S”,“秘密”);
combobox副词.Items.Add(新元组(“D”,“谨慎”));
Combobox副词.DisplayMember=“Item2”;
}
然后在代码中选择与提供的代码匹配的项目:(即“D”)

var item=combobox副词.Items
第()类
.FirstOrDefault(i=>string.Compare(i.Item1,textBox1.Text,true)==0);
如果(项!=null)
ComboBox副词。SelectedItem=项;
这将尝试通过将键与任何输入(在本例中为文本框值)进行比较来查找匹配项,如果找到匹配项,则设置SelectedItem以通知组合框选择它


**编辑:Whups,最初使用KeyValuePair,我不知道它是一个结构,所以没有空检查功能。更改为Tuple(基本上是Pair)

我发现对我有效的方法是在设置selectedindex值后将其存储到combobox的Tag属性中。然后,如果用户试图在selectedIndex应处于“只读”状态时更改它,只需将其更改回Tag属性中存储的selectedIndex值:

comboBoxPlatypusId.SelectedIndex = comboBoxPlatypusId.Items.IndexOf(DuckbillVals[Duckbill_PlatypusID]);
comboBoxPlatypusId.Tag = comboBoxPlatypusId.SelectedIndex;
...
private void comboBoxFunnyMammals_SelectedValueChanged(object sender, EventArgs e) {
    var cb = sender as ComboBox;
    if (cb != null)
    {
        int validSelection = Convert.ToInt32(cb.Tag);
        if (cb.SelectedIndex != validSelection) {
            cb.SelectedIndex = validSelection;
        }
    }
}

我发现对我有效的方法是在设置selectedindex值后将其存储到combobox的Tag属性中。然后,如果用户试图在selectedIndex应处于“只读”状态时更改它,只需将其更改回Tag属性中存储的selectedIndex值:

comboBoxPlatypusId.SelectedIndex = comboBoxPlatypusId.Items.IndexOf(DuckbillVals[Duckbill_PlatypusID]);
comboBoxPlatypusId.Tag = comboBoxPlatypusId.SelectedIndex;
...
private void comboBoxFunnyMammals_SelectedValueChanged(object sender, EventArgs e) {
    var cb = sender as ComboBox;
    if (cb != null)
    {
        int validSelection = Convert.ToInt32(cb.Tag);
        if (cb.SelectedIndex != validSelection) {
            cb.SelectedIndex = validSelection;
        }
    }
}