C# 如果组合框选择的索引为0,则设置null

C# 如果组合框选择的索引为0,则设置null,c#,winforms,combobox,C#,Winforms,Combobox,我有这样一个简单的模型: public class NoteModel { public Guid? DesignGroupId { get; set; } public int? ProjectKey { get; set; } public int? DesignKey { get; set; } } 所以我想将模型设置为: NoteModel model = new NoteModel(); 该属性取决于选定组合框的选

我有这样一个简单的模型:

 public class NoteModel
    {
        public Guid? DesignGroupId { get; set; }
        public int? ProjectKey { get; set; }
        public int? DesignKey { get; set; }
    }
所以我想将模型设置为:

 NoteModel model = new NoteModel();
该属性取决于选定组合框的选定值,因此我需要执行以下操作:

 if(cboDesignGroup.SelectedIndex != 0)
            {
                model.DesignGroupId = Guid.Parse(cboDesignGroup.SelectedValue.ToString());
            }
所以每个属性都有一个if子句,这取决于它的下拉列表。如果combobox=0,则为null,因为我从未设置它


有没有其他方法可以更清晰易读?关于

首先,您的代码建议,如果在组合框中选择了除第一个元素以外的任何元素,则设置guid

0实际上是一个有效的索引,因为组合框是一个零边界索引。(0是第一个元素,1是第二个元素,依此类推)

如果要依赖selectedIndex,应编写如下内容:

 public class NoteModel
    {
        public Guid? DesignGroupId { get; set; }
        public int? ProjectKey { get; set; }
        public int? DesignKey { get; set; }
    }
if(cboDesignGroup.SelectedIndex>-1)
{
model.DesignGroupId=Guid.Parse(cboDesignGroup.Items[cboDesignGroup.SelectedIndex].ToString());
}
//根据您使用的框架(WPF、WinForms等),您可以编写如下内容:
//WPF和WinForms:
如果(cboDesignGroup.SelectedItem!=null)
model.DesignGroupId=Guid.Parse(cboDesignGroup.SelectedItem.ToString());
//或者你可以这样做:
m、 DesignGroupId=(cboDesignGroup.SelectedItem==null?null:(Guid?)Guid.Parse(cboDesignGroup.SelectedItem作为字符串));

如果你努力把列表框填充得很好,其他地方的代码就会更好。本例使用c#7 ValueTuple,但您可以使用Tuple,或者只使用字符串和Guid创建自己的类?财产

var items = new List<(string, Guid?)>();
items.Add(("No selection", (Guid?)null));
items.Add(("Option 1", (Guid?)Guid.NewGuid()));
items.Add(("Option 1", (Guid?)Guid.NewGuid()));
然后,在用户做出选择(不包括选择,列表中的第一项)后,只需将
组合框分配给模型。SelectedValue

model.DesignGroupId = (Guid?)yourcombo.SelectedValue;
组合没有“空白”状态;这就是为什么第一项是“(无选择)”,并且它的值的类型是Guid?和一个值“null”;它可以像任何其他Guid一样直接分配给您的模型?这是有价值的

这里没有“if selectedindex”等;填充模型实际上只是将组合的SelectedValue直接分配到模型中。唯一可以使其更干净的方法是将模型属性数据绑定到组合,可能使用以下方法:

yourcombo.DataBindings.Add("SelectedValue", model, "DesignGroupId");
然后,每次组合失去焦点时,它都会将当前选定的值插入
model.DesignGroupId

:)


如果没有c#7,则可以使用元组:

    private void Form1_Load(object sender, EventArgs e)
    {
        var l = new List<Tuple<string, Guid?>>();
        l.Add(Tuple.Create("No sel", (Guid?)null));
        l.Add(Tuple.Create("opt 1", (Guid?)Guid.NewGuid()));
        l.Add(Tuple.Create("opt 2", (Guid?)Guid.NewGuid()));

        comboBox1.DataSource = l;
        comboBox1.DisplayMember = "Item1";
        comboBox1.ValueMember = "Item2";

    }

    private void button1_Click(object sender, EventArgs e)
    {
        model.Whatever = (Guid?)comboBox1.SelectedValue;
    }
private void Form1\u加载(对象发送方,事件参数e)
{
var l=新列表();
l、 添加(Tuple.Create(“No sel”,(Guid?)null));
l、 添加(Tuple.Create(“opt 1”,(Guid?)Guid.NewGuid());
l、 添加(Tuple.Create(“opt2”,(Guid?)Guid.NewGuid());
comboBox1.DataSource=l;
comboBox1.DisplayMember=“Item1”;
comboBox1.ValueMember=“Item2”;
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
model.whather=(Guid?)comboBox1.SelectedValue;
}

或者你也可以使用自己的类,尽管Tuple就是为它而发明的,所以你不会有太多的小类,它们只不过是两个原语的配对

WinForms,WPF,ASP.NET……?基于模型中的3个属性,总共有3个组合框?您是否知道,如果选择组合框中的第一项,则所选索引为0。如果未选择任何内容,则为
-1
。是的,我知道,这就是为什么我在combobox中有一个默认选项,如果设置了该选项,我希望为null@Flydog57if
如果条件
困扰您,您可以使用
三元运算符
在一行代码中执行此操作,如:
model.DesignGroupId=cboDesignGroup.SelectedIndex!=0 ? Parse(cboDesignGroup.SelectedValue.ToString()):null