0

問題が解決しました - この投稿の下部を参照してください- nullreferenceexception が発生し続けており、その理由がわかりません。2 つのコンボボックスがあり、一方の値を選択すると、もう一方のコンボボックスに関連する値のセットが設定されます。

    <CollectionViewSource x:Key="branchesViewSource"
            Source="{Binding Path=Branches, Source={StaticResource contactDBDataSet}}" />
    <CollectionViewSource x:Key="ranksViewSource"
            Source="{Binding Path=RankPath, Source={StaticResource contactDBDataSet}}" />

        private void loadBranches()
    {
        DocMan.ContactDBDataSet contactDBDataSet = ((DocMan.ContactDBDataSet)(this.FindResource("contactDBDataSet")));
        // Load data into the table Branches. You can modify this code as needed.
        DocMan.ContactDBDataSetTableAdapters.BranchesTableAdapter contactDBDataSetBranchesTableAdapter = new DocMan.ContactDBDataSetTableAdapters.BranchesTableAdapter();
        contactDBDataSetBranchesTableAdapter.Fill(contactDBDataSet.Branches);
        System.Windows.Data.CollectionViewSource branchesViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("branchesViewSource")));
        branchesViewSource.View.MoveCurrentToFirst();
    }

上記は問題なく機能し、最初のコンボボックスにデータが入力されます。この 2 番目のコード ブロックは、2 番目のコンボボックスに入力する必要があります。

DocMan.ContactDBDataSet contactDBDataSet = ((DocMan.ContactDBDataSet)(this.FindResource("contactDBDataSet")));
            // Retrieve branchComboBox SelectedItem
            string currentItem = ((DataRowView)branchComboBox.SelectedItem)["Branch"].ToString();
            // Load data into table Ranks                 
            switch (currentItem)
            {
                case "Army":
                    rankPath = "ArmyRanks";
                    DocMan.ContactDBDataSetTableAdapters.ArmyRanksTableAdapter contactDBDataSetArmyRanksTableAdapter = new ContactDBDataSetTableAdapters.ArmyRanksTableAdapter();
                    contactDBDataSetArmyRanksTableAdapter.Fill(contactDBDataSet.ArmyRanks);
                    break;
                case "Navy":
                    rankPath = "NavyRanks";
                    DocMan.ContactDBDataSetTableAdapters.NavyRanksTableAdapter contactDBDataSetNavyRanksTableAdapter = new ContactDBDataSetTableAdapters.NavyRanksTableAdapter();
                    contactDBDataSetNavyRanksTableAdapter.Fill(contactDBDataSet.NavyRanks);
                    break;
                case blahblahblah and more cases

            }
            // Populate rankComboBox
            System.Windows.Data.CollectionViewSource ranksViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("ranksViewSource")));
            ranksViewSource.View.MoveCurrentToFirst();
        }

最後の行で nullreferenceexception が発生しており、基本的にranksViewSource.Viewがnullであることを示しています。コードの最初のブロックと比較すると、branchsViewSource.View は System.Windows.Data.BindingListCollectionView 型です。事前にどんな助けや洞察も大歓迎です。

_---- _ ----

新しいバインディングを作成し、バインディングのソースとパスを設定してから、必要に応じてコンボボックスの SetBinding() メソッドを適用する必要がありました。

DocMan.ContactDBDataSet contactDBDataSet = ((DocMan.ContactDBDataSet)(this.FindResource("contactDBDataSet")));
            // Create binding
            Binding rankBinding = new Binding();
            // Retrieve branchComboBox SelectedItem
            string currentItem = branchComboBox.SelectedValuePath;
            // Load data into table Ranks                 
            switch (currentItem)
            {
                case "Army":
                    rankBinding.Path = new PropertyPath("ArmyRanks");
                    rankBinding.Source = this.FindResource("rankViewSource");
                    rankComboBox.SetBinding(ComboBox.ItemsSourceProperty, rankBinding);
                    DocMan.ContactDBDataSetTableAdapters.ArmyRanksTableAdapter contactDBDataSetArmyRanksTableAdapter = new ContactDBDataSetTableAdapters.ArmyRanksTableAdapter();
                    contactDBDataSetArmyRanksTableAdapter.Fill(contactDBDataSet.ArmyRanks);
                    // Populate rankComboBox
                    CollectionViewSource armyRanksViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("rankViewSource")));
                    armyRanksViewSource.View.MoveCurrentToFirst();
4

2 に答える 2

1

これが遅い応答であることは承知していますが、私の経験が、私が経験した数日間の痛みを経験した誰かを救うことができるなら、私の経験を共有する価値があると感じています...

コードのこの領域がしばらくの間問題なく実行された後、同じエラーが発生しました。データベースを必要に応じて再構築した後、試行データをテーブルの 1 つにリロードしなかったことが判明しました。テーブルが空だったので、FindResource は有効な CollectionViewSource を返しましたが、その View プロパティは null でした。

私の簡単な修正は、自動生成されたコードを変更してこれをテストし、View が null の場合は MoveCurrentToFirst() を呼び出さないようにすることでした。

CollectionViewSource myViewSource = ((CollectionViewSource)(FindResource("myViewSource")));
if (myViewSource.View != null)
    myViewSource.View.MoveCurrentToFirst();

@ Archaios7、「新しいバインディングを作成し、バインディングのソースとパスを設定してから、コンボボックスの SetBinding() メソッドを適用する必要がある」と言った理由がわからないことを認めなければならないので、あなたの解決策は私のものより優れています。(これを私に説明する必要がある人に感謝します:-)

私のコメントの重要性は、私の解決策よりも問題の原因に関するものだと思います。

于 2016-07-01T01:22:34.333 に答える
0

これの構文のいくつかは私には少しなじみがないので、私は少し推測していますが、何が起こっているのかと私は信じています...

<CollectionViewSource x:Key="branchesViewSource"
        Source="{Binding Path=Branches, Source={StaticResource contactDBDataSet}}" />
                           //  ^  ^ ---------------------------------------
contactDBDataSetBranchesTableAdapter.Fill(contactDBDataSet.Branches);//   |
                           //                                 ^  ^--------|
                           //             path matches so view is populated

<CollectionViewSource x:Key="ranksViewSource"
        Source="{Binding Path=RankPath, Source={StaticResource contactDBDataSet}}" />
        //                     ^  ^---------------------------------------|
contactDBDataSetArmyRanksTableAdapter.Fill(contactDBDataSet.ArmyRanks);// |
        //                                                     ^  ^-------|
        //                           These don't match so from code posted
        //                           view for ranksViewSource is still null   

ある時点で、RankPath に入力する何かが必要になります (これが投稿されたコードから発生するかどうかは不明です)。

于 2012-08-17T00:27:28.140 に答える