質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

3551閲覧

コンボボックスへのアイテム設定について

GOYOSHI

総合スコア18

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/02/13 02:18

お世話になります。

WPF、C#での開発を勉強中のものです。データベースにPostgreSQLを使用してのアプリを進めていまして2つのコンボボックスのうち1つの目のコンボボックスの選択された値をもとに2つ目のコンボボックスの値リストを作成するものですがうまくいきません。

1つ目のコンボボックスの値が選択されたということを知るためにBlendのSelectionChangedを使用しました。以下にコードを示します。XAMLです。

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:AIT_Shipment2.Views" xmlns:vm="clr-namespace:AIT_Shipment2.ViewModels" xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" xmlns:System="clr-namespace:System;assembly=mscorlib" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" x:Class="AIT_Shipment2.Views.ShukkaJyokyo" mc:Ignorable="d" d:DesignHeight="640" d:DesignWidth="1050"> <UserControl.Resources> <vm:ShukkaJyokyoVM x:Key="ViewDataDataSource" d:IsDataSource="True"/> </UserControl.Resources> <UserControl.DataContext> <vm:ShukkaJyokyoVM /> </UserControl.DataContext> <Grid Background="White"> <StackPanel HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"> <StackPanel Height="24" Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,10"> <Label x:Name="label" Content="納入日:" Margin="20,0,0,0"/> <xctk:DateTimePicker x:Name="dtpSdate" Width="110" ShowButtonSpinner="False" TimePickerVisibility="Hidden" Format="LongDate" Value="{Binding Path=StartDate}" AutoCloseCalendar="True" AllowTextInput="False"/> <Label x:Name="label1" Content="~"/> <xctk:DateTimePicker x:Name="dtpEdate" Width="110" ShowButtonSpinner="False" TimePickerVisibility="Hidden" Format="LongDate" Value="{Binding Path=EndDate}" AllowTextInput="False" AutoCloseCalendar="True"/> <Label x:Name="label2" Content="納入先:" Margin="20,0,0,0"/> <ComboBox x:Name="cmbNsaki" Width="220" ItemsSource="{Binding trhksks}" SelectedValuePath="tkCD" SelectedItem="{Binding SelectedtkCD}"> <ComboBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding tkCD}" Margin="2.5"/> <TextBlock Text="{Binding tkNM}" Margin="2.5"/> </StackPanel> </DataTemplate> </ComboBox.ItemTemplate> <i:Interaction.Triggers> <i:EventTrigger EventName="SelectionChanged"> <ei:CallMethodAction TargetObject="{Binding}" MethodName="Execute"/> </i:EventTrigger> </i:Interaction.Triggers> </ComboBox> <Label x:Name="label3" Content="便:" Margin="20,0,0,0"/> <ComboBox x:Name="cmbBin" Width="50" ItemsSource="{Binding binLists}" DisplayMemberPath="BinNo" SelectedValuePath="BinNo"> </ComboBox> <Button x:Name="button" Content="表示" Margin="50,0,0,0" Width="100" Height="24"/> </StackPanel> <StackPanel Height="410"> <DataGrid x:Name="dataGrid" Height="400"/> </StackPanel> <StackPanel Height="40" Orientation="Horizontal" HorizontalAlignment="Right"> <!--<TextBox x:Name="textBox" Height="23" TextWrapping="Wrap" Text="{Binding SelectedValue, ElementName=cmbNsaki}" Width="120"/>--> <Button x:Name="button1" Content="Button" Width="100" Margin="0"/> <Button x:Name="button2" Content="Button" Width="100" Margin="100,0,0,0"/> <Button x:Name="button3" Content="Button" Width="100" Margin="30,0,20,0"/> </StackPanel> </StackPanel> </Grid> </UserControl>

次にViewMODELに該当するコードです。

using

1using System.Collections.Generic; 2using System.Collections.ObjectModel; 3using System.ComponentModel; 4using System.Linq; 5using System.Runtime.InteropServices.ComTypes; 6using System.Text; 7using System.Threading.Tasks; 8using System.Windows.Data; 9 10namespace AIT_Shipment2.ViewModels 11{ 12 public class ShukkaJyokyoVM : ViewModelBase 13 { 14 private DateTime _StartDate = DateTime.Now; 15 public DateTime StartDate 16 { 17 get { return _StartDate; } 18 set 19 { 20 if (_StartDate != value) 21 { 22 _StartDate = value; OnPropertyChanged("StartDate"); 23 } 24 } 25 } 26 27 private DateTime _EndDate = DateTime.Now; 28 public DateTime EndDate 29 { 30 get { return _EndDate; } 31 set 32 { 33 if (_EndDate != value) 34 { 35 _EndDate = value; OnPropertyChanged("EndDate"); 36 } 37 } 38 } 39 40 // 得意先マスタよりコードと名称をコレクションに設定 41 //IList<Trhksk> trhksks = new ObservableCollection<Trhksk>(); 42 public IList<Trhksk> trhksks 43 { 44 get 45 { 46 using (var db = new Models.PgSQLConnection(clsConst.dBID, clsConst.dBPW, clsConst.dBSC)) 47 { 48 var b = from t in db.bomm_torihikisakis 49 where t.enable == 0 50 select new Trhksk 51 { 52 tkCD = t.torihikicd, 53 tkNM = t.torihikinm 54 }; 55 return b.ToList(); 56 } 57 } 58 } 59 // 取引先の選択を受け取る 60 public Trhksk SelectedtkCD { get; set; } 61 62 //便リスト作成 63 //public IList<binList> binLists { get; set; } 64 public ObservableCollection<binList> binLists { get; set; } 65 66 67 public void Execute() 68 { 69 if (SelectedtkCD == null) 70 { 71 return; 72 } 73 using (var db = new Models.PgSQLConnection(clsConst.dBID, clsConst.dBPW, clsConst.dBSC)) 74 { 75 var b = from t in db.koum_shukkabins 76 where t.nonyusaki == SelectedtkCD.tkCD 77 orderby t.bin 78 select new binList 79 { 80 BinNo = t.bin.ToString() 81 }; 82 //binLists = b.ToList(); 83 ObservableCollection<binList> binLists = new ObservableCollection<binList>(b.ToList()); 84 } 85 } 86 //// 便リスト作成 87 //public IList<binList> binLists 88 //{ 89 // get 90 // { 91 // using (var db = new Models.PgSQLConnection(clsConst.dBID, clsConst.dBPW, clsConst.dBSC)) 92 // { 93 // var b = from t in db.koum_shukkabins 94 // where t.nonyusaki == "3230-1" 95 // orderby t.bin 96 // select new binList 97 // { 98 // BinNo = t.bin.ToString() 99 // }; 100 // return b.ToList(); 101 // } 102 // } 103 //} 104 } 105 106 // 出荷状況画面得意先選択設定 107 public class Trhksk 108 { 109 public string tkCD { get; set; } 110 public string tkNM { get; set; } 111 } 112 113 public class binList 114 { 115 public string BinNo { get; set; } 116 } 117 118コード

以下のコードで最初からバインディングするのであればリストが作成されることは確認いたしました。
// 便リスト作成
public IList<binList> binLists
{
get
{
using (var db = new Models.PgSQLConnection(clsConst.dBID, clsConst.dBPW, clsConst.dBSC))
{
var b = from t in db.koum_shukkabins
where t.nonyusaki == "3230-1"
orderby t.bin
select new binList
{
BinNo = t.bin.ToString()
};
return b.ToList();
}
}
}

デバッグでは『Execute()』は実行され、『where t.nonyusaki == SelectedtkCD.tkCD』にも選択された値が設定されることは確認できました。

プロパティーの受け渡しなど理解度不足とは思いますがなどアドバイスいただけましたら助かります。

また、作法等で『動くけどこれはちょっとおかしい。』などもありましたらご指摘お願いできればと思います。

以上、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

私も複数の ComboBox を置いて、それぞれの選択内容によって選択肢を変更することをよくやります。
その場合は、ComboBox の DropDownOpened イベントで自身の ItemsSource を変更しています。
そうすることで、自由度の高いUIを少ない手間で実装できます。
欠点としては、DBに都度接続すると時間がかかるので事前にキャッシュを持つ必要が出てくることが考えられます。

投稿2017/02/13 05:44

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GOYOSHI

2017/02/14 23:34

ご回答ありがとうございました。 DropDownOpened イベントというものもあるんですね。機会がありましたら取り組んでみたいと思います。 また、DBのキャッシュにも興味をひかれました。今製作中のものもDBを読み込むためのタイムラグ的なものが大きく、どうにかしなければと思っていたところでした。 質問させていただくことがあろうかと思いますがよろしくお願いいたします。
guest

0

ベストアンサー

//binLists = b.ToList();
ObservableCollection<binList> binLists = new ObservableCollection<binList>(b.ToList());

ここが悪い。せっかくbinListsに紐付いているのに、newしたら、ひも付きを切れてしまっている。
この場合、binListsをクリヤーしてから、追加していくという処理が必要。

それは面倒なので、ObservableCollectionを使うより、普通のListを使って、TwoWayにすべき。
あとは、binListsが切り替えたことをOnPropertyChanged("binLists");で通知しよう。

投稿2017/02/13 02:41

kiichi54321

総合スコア1984

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GOYOSHI

2017/02/14 23:29

ご回答ありがとうございます。 ご指摘の通りコレクションではなくリストを利用させていただき public IList<binList> binLists { get; set; } と binLists = b.ToList();をコメントを入れ替えました。 さらにpublic ObservableCollection<binList> binLists { get; set; } を 以下のように変更しました。 private IList<binList> _binLists; public IList<binList> binLists { get { return _binLists; } set { if (_binLists != value) { _binLists = value; OnPropertyChanged("binLists"); } } } 更に以下のようにTwoWayを追加いたしました。 ItemsSource="{Binding binLists, Mode=TwoWay}" 期待通りに表示させることができました。 諸先輩に追いつきたく何とかコードビハインドしないようにし、そのメリットを理解したいと思っていますが『コードビハインドに書いたほうが多分短いよな!』と思いながら苦慮しています。 ありがとうございました。
kiichi54321

2017/02/15 03:25

MVVMアプローチは、UIが複雑化、アプリケーションが巨大化したとき発揮するので、かんたんなサンプル程度だと、回りくどいことをしているものになりますね。 今時は、JSに、Vue.jsなどを導入しないとだめということがよくいわれるので、昔よりは、やるモチベーションを高められるのじゃないのでしょうか。(やりたいことは同じです)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問