Question

strstrstr on Thu, 13 Mar 2014 10:47:06


データベースでたとえば

テーブルA

"都道府県id"

0

1

2

3

テーブルB

"id","名前"

0,北海道

1,青森県

2,岩手県

3,福島県

表示はテーブルA上でテーブルBをコンボボックスで表示させたいです。

axmlでの静的なコンボボックスの表示はWeb上でサンプルを探せました。また都合上EntityFrameworkが使えない状況です。

これをC#上でどうやったら表現できますか。



Sponsored



Replies

gekka on Thu, 13 Mar 2014 12:06:37


まったくのXAML無しなら、こんな

using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Data;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataTable tableA = new DataTable();
            tableA.Columns.Add(new DataColumn("都道府県id", typeof(int)));

            DataTable tableB = new DataTable();
            tableB.Columns.Add(new DataColumn("id", typeof(int)));
            tableB.Columns.Add(new DataColumn("名前", typeof(string)));

            DataSet ds = new DataSet();
            ds.Tables.Add(tableA);
            ds.Tables.Add(tableB);

            for (int i = 0; i < 4; i++)
            {
                DataRow row = tableA.NewRow();
                row[0] = i;
                tableA.Rows.Add(row);
            }

            foreach(string s in new string[]{"北海道","青森県","岩手県","福島県"})
            {
                DataRow row = tableB.NewRow();
                row["id"] = tableB.Rows.Count;
                row["名前"] = s;
                tableB.Rows.Add(row);
            }

            DataGridComboBoxColumn clm = new DataGridComboBoxColumn();
            clm.Header = "都道府県";
            clm.SelectedValueBinding = new Binding("[都道府県id]"); //DataGridRowのDataContextに対してのバインディング
            clm.SelectedValuePath = "[id]";//ComboBoxで選択されたItemからSelectedValueBindingに設定される値を選ぶためのBindingに使うPath
            clm.DisplayMemberPath = "[名前]";//ComboBoxの一覧で表示されるItemで表示に使うBindingのPath
            //以上のPath指定で[]でくくっているのは型付DataTableではないので、DataRowView[]のインデクサ経由になってるから
            //型付DataTableの場合は[]でくくる必要なし

            clm.ItemsSource = tableB.Rows;
            
            DataGrid dataGrid = new DataGrid();
            dataGrid.AutoGenerateColumns = false;
            dataGrid.Columns.Add(clm);

            dataGrid.ItemsSource = tableA.DefaultView;
            
            this.Content = dataGrid;
            this.DataContext = ds;
        }
    }
}

trapemiya on Fri, 14 Mar 2014 01:13:50


XAMLを使わないというよりは、XAML側でコンボボックスの値一覧を持ちたくないということでしょうか?
であれば、以下のようなことでしょうか?

DataGridのComboBoxについて
http://social.msdn.microsoft.com/Forums/netframework/ja-JP/96d87dcf-33c8-4ef0-bdd7-e7b1a9c06704/datagridcombobox?forum=wpfja

そうであれば、上のスレッドに書いてある通り、上のスレッドの内容のままでは冗長ですので、改訂版を後にアップするつもりでいます。

strstrstr on Fri, 14 Mar 2014 01:43:56


このソースを参考に無事思い通りに設定できました。

ありがとうございます。

strstrstr on Fri, 14 Mar 2014 05:17:59


XAMLを使わないというよりは、XAML側でコンボボックスの値一覧を持ちたくないということでしょうか?
であれば、以下のようなことでしょうか?

DataGridのComboBoxについて
http://social.msdn.microsoft.com/Forums/netframework/ja-JP/96d87dcf-33c8-4ef0-bdd7-e7b1a9c06704/datagridcombobox?forum=wpfja

そうであれば、上のスレッドに書いてある通り、上のスレッドの内容のままでは冗長ですので、改訂版を後にアップするつもりでいます。


★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


そのとおりです。よろしければアップをお願いいたします。

trapemiya on Fri, 14 Mar 2014 05:52:04


忘れていましたが、以前、書いていたみたいです。どこかにアップしたかなぁ?

<Window x:Class="test2010wpf.DataGridComboBox3"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DataGridComboBox3" Height="300" Width="300"
		Name="MyWindow">
    <Grid>
		<DataGrid AutoGenerateColumns="False" Height="200" 
                HorizontalAlignment="Left" Margin="10,10,0,0" Name="dataGrid1" VerticalAlignment="Top"
                 Width="200" ItemsSource="{Binding 人List}"> <DataGrid.Columns> <DataGridTemplateColumn Header="名前"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding 名前}"></TextBox> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="都道府県"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <ComboBox Name="cmb都道府県"
                                ItemsSource="{Binding RelativeSource=
{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}},
Path=DataContext.都道府県List, Mode=OneWay}"      DisplayMemberPath="名称" SelectedValuePath="code" SelectedValue="{Binding code都道府県}">
</ComboBox> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> </Grid> </Window>

namespace test2010wpf
{
    /// <summary>
    /// DataGridComboBox3.xaml の相互作用ロジック
    /// </summary>
    public partial class DataGridComboBox3 : Window
    {
        public DataGridComboBox3()
        {
            InitializeComponent();

            人List = new List<人>   
            {   
               new 人() { 名前 = "鈴木", code都道府県 = "1" },   
               new 人() { 名前 = "佐藤", code都道府県 = "2" }
            };

            都道府県List = new List<都道府県>   
            {   
               new 都道府県() { code = "1", 名称 = "東京" },   
               new 都道府県() { code = "2", 名称 = "大阪" }
            };

            this.DataContext = this;
        }

        public List<人> 人List { get; set; }
        public List<都道府県> 都道府県List { get; set; }
    }

    public class 人
    {
        public string 名前 { get; set; }
        public string code都道府県 { get; set; }
    }

    public class 都道府県
    {
        public string code { get; set; }
        public string 名称 { get; set; }
    }
}


★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/