1

我有一个由 LINQ 查询填充的 ComboBox:

var locations = 
    from loc in db.LOCATIONs
        .Where(a => a.Omit == false)
select new
{
    LocationID = loc.LocationID,
    Location = loc.Location1
};

cbo = this.cboAdminLocation;
cbo.DataSource = locations;
cbo.DisplayMember = "Location";
cbo.ValueMember = "LocationID";
cbo.SelectedIndex = -1;

我还有一个例程 DisplayAccounts(),它列出了 DataGridView 中的所有帐户,但如果选择,则按组合中选择的值进行过滤,如果没有,则显示所有帐户。我认为这将非常简单,并尝试使用 DisplayAccounts() 中的以下语句来处理它:

if (this.cboAdminLocation.SelectedIndex > -1)
    filterAdminLocation = Convert.ToInt32(this.cboAdminLocation.SelectedValue.ToString());
else
    filterAdminLocation = 0;

在 LINQ 查询结束时:

if (filterAdminLocation > 0)
{
    accountData = accountData.Where(a => a.LocationID == filterAdminLocation);
}

但是,我在第一轮循环中(即在有机会从组合中选择一个值之前)出现“输入字符串的格式不正确”的错误,实际上这个阶段的组合值是显示为{ LocationID = 1, Location = "Brentwood" }并且所选索引为 0。如果我跳过此步骤并在我选择了一个值时进行测试,它会按预期返回一个整数值。

if (this.cboAdminLocation.SelectedIndex > -1)因此,我的问题是,为什么当所选索引为0时,为什么要超越测试,而当我在填充控件时明确将其明确设置为-1时,为什么选择了所选索引0?

我很欣赏这可能很简单,但我对 C# 还很陌生,所以你必须原谅我的愚蠢!

4

1 回答 1

1

Therefore, my question is why does get past the if (this.cboAdminLocation.SelectedIndex > -1) test when the selected index is supposedly 0, and more to the point why is the selected index 0 when I explicitly set it to -1 when填充控件?

这是因为您首先填充了组合框,然后将选定的索引设置为-1. 在这两个步骤之间,选定的索引是 - 短时间 - 0

为了纠正这种情况,您DisplayAccounts()只能在运行后调用您的例程cbo.SelectedIndex = -1;。我猜你调用DisplayAccounts()了组合框的 SelectedIndexChanged 事件。如果是这样,请将事件附加到其后的组合框(如果您已在 Designer 窗口中添加事件,请确保将其从Designer.cs文件中删除):

//...
cbo = this.cboAdminLocation;
cbo.DataSource = locations;
cbo.DisplayMember = "Location";
cbo.ValueMember = "LocationID";
cbo.SelectedIndex = -1;
cbo.SelectedIndexChanged += new EventHandler(cbo_SelectedIndexChanged);
于 2012-09-12T14:07:06.810 回答