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;

また、DataGridView内のすべてのアカウントを一覧表示するルーチンDisplayAccounts()がありますが、選択されている場合はコンボで選択された値でフィルタリングされ、選択されていない場合はすべてのアカウントが表示されます。これは非常に簡単だと思い、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

したがって、私の質問は、選択されたインデックスがおそらく0であるときにif(this.cboAdminLocation.SelectedIndex> -1)テストを通過する理由です。さらに、明示的に-1に設定したときに選択されたインデックスが0である理由は、コントロールにデータを入力しますか?

これは、最初にコンボボックスにデータを入力してから、選択したインデックスをに設定するためです-1。この2つのステップの間で、選択されたインデックスは-短時間-0です。

これを修正するには、をDisplayAccounts()実行した後でのみルーチンを呼び出すことができますcbo.SelectedIndex = -1;DisplayAccounts()コンボボックスのSelectedIndexChangedイベントを呼び出すと思います。その場合は、イベントをコンボボックスの後に添付します(デザイナーウィンドウでイベントを追加した場合は、必ず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 に答える