-1

私は二つの辞書を持っています。 Excelシートからの列のリストと定義された列のリストを持つもの。定義された列がシートに存在するかどうか知りたいのですが。存在する場合は、選択されたドロップダウンリストで選択されます。

行にdropdownList.SelectedValue = selectedItem.First()。キー;エラーメッセージシーケンスに要素が含まれていないことがあります。安全性をコード化したと思いました。私は何を忘れますか?

... コマンド ...

SetDataSource(import.ColumnList, import.DefColumnList, ddlSomeColumn, SomeEnum.Zipcode);

...そして呼び出し元のメソッド...

    private void SetDataSource(Dictionary<int, string> columnList, Dictionary<int, string> defColumnList, DropDownList dropdownList, SomeEnum item)
    {
        int index = (int)item;
        dropdownList.BeginUpdate();
        dropdownList.ValueMember = "Key";
        dropdownList.DisplayMember = "Value";
        dropdownList.DataSource = columnList;
        if (defColumnList.ContainsKey(index) && defColumnList[index].Length > 0)
        {
            var selectedItem = columnList.Where(cl => cl.Value == defColumnList[index]);
            if (selectedItem != null)
                dropdownList.SelectedValue = selectedItem.First().Key;
        } 
        dropdownList.EndUpdate();
    }


  • selectedItem.First()selectedItemが空のときにエラーが発生します。 - Mixxiphoid
  • これはときに起こりますcolumnList.Where(cl => cl.Value == defColumnList[index])空のシーケンスを生成し、それを次に呼び出すFirst()に。 - spender
  • SelectedItemアイテムの列を生成しようとしています。それがnullでないかどうかを確認するとき、シーケンスはnullではなく呼び出しFirstこのエラーが発生します。あなたのチェックをこのようなものに変更するのが最善ですvar selectedItem = columnList.Where(cl => cl.Value == defColumnList [index]); if(selectedItem!= null& selectedItem.Any())dropdownList.SelectedValue = selectedItem.First()。 - Bad Dub
  • First()が空のときはエラーになることを私は知っています。しかし、私はこのようなものを探していました:if(selectedItem.Any())。そしてそれはうまくいきます... - user1531040
  • 私は今理解しています:私の質問の題名が間違っていました...私はこれを変えました。 - user1531040

2 답변


2

このエラーの意味は、最初の要素にアクセスしようとしているときにselectedItemに要素がないということです。これは不可能です。

NULL可能性をチェックする代わりに、コレクション内に何らかの要素があるかどうかをチェックしてから実行するFirstコレクションのメソッド

var selectedItem = columnList.Where(cl => cl.Value == defColumnList[index]);
if (selectedItem.Any())
    dropdownList.SelectedValue = selectedItem.First().Key;


1

.Where()演算子は、単一の要素ではなく列挙型を返します。したがって、あなたのselectedeItem!= null条件は常にtrueを返します。コードをこれに変更してください。

private void SetDataSource(Dictionary<int, string> columnList, Dictionary<int, string> defColumnList, DropDownList dropdownList, SomeEnum item)
    {
        int index = (int)item;
        dropdownList.BeginUpdate();
        dropdownList.ValueMember = "Key";
        dropdownList.DisplayMember = "Value";
        dropdownList.DataSource = columnList;
        if (defColumnList.ContainsKey(index) && defColumnList[index].Length > 0)
        {
            var selectedItem = columnList.FirstOrDefault(cl => cl.Value == defColumnList[index]);
            if (selectedItem != null)
                dropdownList.SelectedValue = selectedItem.Key;
        } 
        dropdownList.EndUpdate();
    }


  • このコードも常に評価されますselectedItem != nullとしてtrue。 - Enigmativity
  • selectedItem!= nullの場合は選択します。私には正しいようです。 - Amy B
  • @DavidB - このコードは、OPが探しているセマンティクスを変更します。それは間違っています。 - Enigmativity
  • @Enigmativityいいえ、OPはWhereに対してnullの結果をテストします。これは常にfalseです。それはOPの間違いです - 変更する必要があります。 - Amy B
  • @DavidB - はい、しかしのデフォルト値KeyValuePair<int, string>決してないnullKeyValuePair<int, string>値型です。 - Enigmativity

リンクされた質問


最近の質問