locked
Silverlight DataGrid に C# でコンボボックスを追加する方法 RRS feed

  • 質問

  • お世話になります。

    DataGridのセルにコンボボックスをセットしたいと考えています。

    インターネットで調べると以下のようなXAMLで実現出来ると何箇所かのサイトで記載されていました。

    #インターネットそのままを貼付けます

     

    <sdk:DataGridTemplateColumn  Header="Fuel Type">
        <sdk:DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                 <TextBlock Margin="2" VerticalAlignment="Center"  
           HorizontalAlignment="Left" Text="{Binding FUEL_TYPE}" Width="120" />
            </DataTemplate>
            </sdk:DataGridTemplateColumn.CellTemplate>
                 <sdk:DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox Height="23" Name="cbxFuelType"
                                ItemsSource="{StaticResource FuelList}"
                                SelectedValue="{Binding Path=FUEL_TYPE, Mode=TwoWay}" Width="120">
                        </ComboBox>
                     </DataTemplate>
           </sdk:DataGridTemplateColumn.CellEditingTemplate>
    </sdk:DataGridTemplateColumn>

     

    しかし、動的に列を生成しているため、C#のコードから同様の事を実現したいです。

     

    DataGridTemplateColumn dtgdTmpClmn = new DataGridTemplateColumn() ;
    var template = new DataTemplate();

    var template2 = new DataTemplate();

     

    dtgdTmpClmn.Header = "列名";

    dtgdTmpClmn.CellTemplate = template;

    dtgdTmpClmn.CellEditingTemplate = template2;

    dtgd.Columns.Add(dtgdTmpClmn);//dtgdはXAMLでセット済みのDataGrid

     

    上記のような雰囲気を想像しているのですが、DataTemplate にどのようにコンボボックスなどをセットすればいいのかがわかっていません。

     

    C#から実現する方法をご教示いただけないでしょうか。

    よろしくお願いします。

     


    2011年8月11日 6:01

回答

すべての返信

  • 以下が参考になりませんでしょうか?

    Defining Silverlight DataGrid Columns at Runtime
    http://blogs.msdn.com/b/scmorris/archive/2008/04/14/defining-silverlight-datagrid-columns-at-runtime.aspx

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク でぃあい 2011年8月11日 10:18
    2011年8月11日 7:03
    モデレータ
  • ご返信ありがとうございます。

     

    一応上記と同一のサイトだった定かではないのですが

    同様の処理を記載したサイトにも目を通していたのですが、

     

    DataGridTemplateColumn templateColumn = new DataGridTemplateColumn();
    templateColumn.Header = "Birthday";
    templateColumn.CellTemplate = (DataTemplate)Resources["myCellTemplate"];
    templateColumn.CellEditingTemplate =
    (DataTemplate)Resources["myCellEditingTemplate"];
    targetDataGrid.Columns.Add(templateColumn);

     

    Resources

     

    で コンテキスト内に存在しないと エラーが出てしまいます。

    記載忘れましたが

    Silverlight4 、VWD2010Express で開発しています。

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Controls.Primitives;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Text.RegularExpressions;
    using System.Collections.ObjectModel;
    using System.Windows.Data;

     

    usingは上記を使用しています。

    MSDNでも検索してみたのですがResoucesが何なのかよくわかりません。

     

    上記のような方法でも問題ないですし、

    C#ののみコードでも良いのですが

    行き詰ってしまっています。

     

    よろしくお願いいたいします。

     


    2011年8月11日 7:41
  • ResourcesはFrameworkElementのプロパティになります。usingは特に関係ありません。したがって、this.Resourcesのように書けます。作成されているページのクラスは何を継承されていますか? 例えばUserControlとかではないのでしょうか?

    FrameworkElement.Resources プロパティ
    http://msdn.microsoft.com/ja-jp/library/system.windows.frameworkelement.resources(v=VS.100).aspx

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク でぃあい 2011年8月11日 10:18
    2011年8月11日 8:24
    モデレータ
  • ありがとうございます!

     

    Resoucesを記載するクラスを間違えていました。

    UserControl を継承したクラスで使用したところ無事にDataGridにコンボボックスが表示されました。

     

    はまってたので助かりました。

    ありがとうございました。


    2011年8月11日 10:17