2017-07-11 12 views
0

私の工場の一部のツールでテストに関する情報を表示する新しいプログラムを開発中です。 これを実行するために、私は実行時にDataGridコントロールを作成し、それを作成しています。この部分はうまく機能しています。WPFの背後にあるコードでDataGridRowsDetailsを作成

私の問題はRowDetailsを追加することです。どうすればそのコードの中で行うことができますか?

if (datatable.Rows.Count != 0) 
    { 
     foreach (DataRow dt in datatable.Rows) 
     { 
      if (last_tool_test == "" || last_tool_test != dt[1].ToString()) 
      { 
       last_tool_test = dt[1].ToString(); 
       txt = new TextBlock(); 
       txt.Text = dt[1].ToString() + " :"; 
       txt.TextDecorations = TextDecorations.Underline; 
       txt.HorizontalAlignment = HorizontalAlignment.Center; 
       txt.Margin = new Thickness(0, 0, 0, 7); 

       data = new DataGrid(); 
       data.Width = double.NaN; 
       data.Margin = new Thickness(5, 0, 5, 5); 
       data.HeadersVisibility = DataGridHeadersVisibility.Column; 
       data.CanUserAddRows = false; 
       data.CanUserDeleteRows = false; 
       data.CanUserReorderColumns = false; 
       data.CanUserResizeColumns = false; 
       data.CanUserSortColumns = false; 
       data.IsReadOnly = true; 
       data.SelectionMode = DataGridSelectionMode.Extended; 
       DataGridTextColumn col1 = new DataGridTextColumn(); 
       col1.Header = "Recipe Name"; 
       col1.Binding = new Binding("Recipe_Name"); 
       col1.Width = new DataGridLength(1, DataGridLengthUnitType.Star); 
       var style = new Style(typeof(DataGridColumnHeader)); 
       style.Setters.Add(new Setter() 
       { 
       Property = HorizontalAlignmentProperty, 
       Value = HorizontalAlignment.Stretch 
       }); 
       style.Setters.Add(new Setter() 
       { 
       Property = HorizontalContentAlignmentProperty, 
       Value = HorizontalAlignment.Center 
       }); 
       style.Setters.Add(new Setter() 
       { 
       Property = FontWeightProperty, 
       Value = FontWeights.Bold 
       }); 
       var style1 = new Style(typeof(TextBlock)); 
       style1.Setters.Add(new Setter() 
       { 
       Property = HorizontalAlignmentProperty, 
       Value = HorizontalAlignment.Center 
       }); 
       col1.HeaderStyle = style; 
       col1.ElementStyle = style1; 
       data.Columns.Add(col1); 
       DataGridTextColumn col2 = new DataGridTextColumn(); 
       col2.Header = "Foup"; 
       col2.Width = 100; 
       col2.Binding = new Binding("Foup"); 
       col2.HeaderStyle = style; 
       col2.ElementStyle = style1; 
       data.Columns.Add(col2); 
       DataGridTextColumn col3 = new DataGridTextColumn(); 
       col3.Header = "Need Reference?"; 
       col3.Width = 110; 
       col3.HeaderStyle = style; 
       col3.ElementStyle = style1; 
       col3.Binding = new Binding("Reference"); 
       data.Columns.Add(col3); 
       DataGridTextColumn col4 = new DataGridTextColumn(); 
       col4.Header = "# Iteration"; 
       col4.Width = 100; 
       col4.HeaderStyle = style; 
       col4.ElementStyle = style1; 
       col4.Binding = new Binding("Iteration"); 
       data.Columns.Add(col4); 
       DataGridTextColumn col5 = new DataGridTextColumn(); 
       col5.Header = "Spec"; 
       col5.Width = 100; 
       col5.HeaderStyle = style; 
       col5.ElementStyle = style1; 
       data.Columns.Add(col5); 
       col5.Binding = new Binding("Spec"); 
       st.Children.Add(txt); 
       st.Children.Add(data); 
      }          
      data.Items.Add(new Tool_Test() { Recipe_Name = dt[2].ToString(), Foup = dt[3].ToString(), Reference = dt[4].ToString(), Iteration = dt[5].ToString(), Spec = dt[6].ToString() }); 
     } 
     last_tool_test = ""; 
     } 
    } 

編集:私はリソースを使用して、解決策を見つけたと思う:今では半分働いて

data.RowDetailsTemplate = (DataTemplate)this.Resources["CustomTemplate"]; 

<Window.Resources> 
    <DataTemplate x:Key="CustomTemplate"> 
     <DataGrid x:Name="datagrid1" HeadersVisibility="Column" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="False" SelectionMode="Extended" Margin="5,0,5,50" CanUserResizeColumns="False" AutoGenerateColumns="False" VerticalAlignment="Top" IsReadOnly="True" Width="750"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Sub Test Name" Width="*" Binding="{Binding Path=Recipe_Name}"> 
        <DataGridTextColumn.HeaderStyle> 
         <Style TargetType="DataGridColumnHeader"> 
          <Setter Property="HorizontalAlignment" Value="Stretch"/> 
          <Setter Property="HorizontalContentAlignment" Value="Center"/> 
          <Setter Property="FontWeight" Value="Bold" /> 
         </Style> 
        </DataGridTextColumn.HeaderStyle> 
        <DataGridTextColumn.ElementStyle> 
         <Style TargetType="TextBlock"> 
          <Setter Property="HorizontalAlignment" Value="Center" /> 
         </Style> 
        </DataGridTextColumn.ElementStyle> 
       </DataGridTextColumn> 
       <DataGridTextColumn Header="Spec" Width="*" Binding="{Binding Path=Foup}"> 
        <DataGridTextColumn.HeaderStyle> 
         <Style TargetType="DataGridColumnHeader"> 
          <Setter Property="HorizontalAlignment" Value="Stretch"/> 
          <Setter Property="HorizontalContentAlignment" Value="Center"/> 
          <Setter Property="FontWeight" Value="Bold" /> 
         </Style> 
        </DataGridTextColumn.HeaderStyle> 
        <DataGridTextColumn.ElementStyle> 
         <Style TargetType="TextBlock"> 
          <Setter Property="HorizontalAlignment" Value="Center" /> 
         </Style> 
        </DataGridTextColumn.ElementStyle> 
       </DataGridTextColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
    </DataTemplate> 
</Window.Resources> 

と私のコードで私はこれを追加しました。私はリソースへの経験がないので、データをバインドするソリューションを見つけることができません。どうやってやるの?

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

+1

なぜコードビハインド(C#)を使用してDataGridTextColumnを追加しているのですが、より効率的な方法はXAMLを使用することです。 –

+0

私は自分のデータベース – dadou

+0

@dadouから各要素のDatagridコントロールを作成しているので、データバインディングを使用し、グリッドでデータテンプレートを構築する必要があります。 –

答えて

0

あなたがプログラムでXamlReaderクラス、例えば使用して作成したDataTemplateRowDetailsTemplateプロパティを設定することができます:私はあなたがオブジェクトのいずれかのObservableCollectionを投げることができ、これらの線に沿って何か一般的なユーザーコントロールを構築してい

string template = "<DataTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x = \"http://schemas.microsoft.com/winfx/2006/xaml\"><TextBlock Text=\"some text...\"></DataTemplate>"; 
data.RowDetailsTemplate = XamlReader.Parse(template) as DataTemplate; 
0

をテーブルを作成しますが、ヘッダーの列幅などを定義して、ヘッダーとデフォルトの幅に関数名を使用するだけではありません。私は、(私はMVVMパターンを使用していた)各モデルのためにこれらのコレクションを作る

public DataGridColumnSettings(string Header, int ColumnIndex, bool IsReadOnly = true, string Width = "100", bool ComboBoxColumn = false, bool CheckBoxColumn = false) 
    { 
     this.Header = Header; 
     this.ColumnIndex = ColumnIndex; 
     this.IsReadOnly = IsReadOnly; 
     this.Width = Width; 
     this.ComboBoxColumn = ComboBoxColumn; 
     this.CheckBoxColumn = CheckBoxColumn; 
    } 

 public static Dictionary<string, DataGridColumnSettings> ColumnSettings 
     { 
      get { return new Dictionary<string, DataGridColumnSettings>() { { "PurchaseOrder", new DataGridColumnSettings("Order Number", 0) }, { "Width", new DataGridColumnSettings("Width", 1) }, { "Length", new DataGridColumnSettings("Length", 2) }, { "NumberOfPallets", new DataGridColumnSettings("No of Pallets", 3) }, { "BoardsPerStack", new DataGridColumnSettings("No of Boards", 4) }, { "NumberOfBoards", new DataGridColumnSettings("Total Boards", 5) } }; ; } 
     } 

まず私は、各列の設定を保持するオブジェクトを作成しましたディクショナリキーは、テーブル行の必須値のモデルからのget setメソッドです(これはデフォルトで列が呼び出されるものです)

このディクショナリを渡すn個のビューオブジェクト(ユーザーコントロール)を作成し、ビュー内に格納:

v_DataTable View = new v_DataTable(Model.ColumnSettings); 

は現在、データグリッドの自動生成列イベントのハンドラを追加します

<DataGrid AutoGeneratingColumn="dataGrid_AutoGeneratingColumn" />(XAML)

をして追加背後にあるコードのハンドラ:

ここ
private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    string headername = e.Column.Header.ToString(); 

    //// Any column not in header details is a hidden column 
    if (this.headerDetails.ContainsKey(headername)) 
    { 
     Style centerStyle = new Style { TargetType = typeof(DataGridCell) }; 
     centerStyle.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Center)); 
     Style headerCenterStyle = new Style { TargetType = typeof(DataGridColumnHeader) }; 
     headerCenterStyle.Setters.Add(new Setter(HorizontalContentAlignmentProperty, HorizontalAlignment.Center)); 


     try 
     { 
      e.Column.Width = Double.Parse(this.headerDetails[headername].Width); 
     } 
     catch(Exception ex) 
     { 
       e.Column.Width = 100; 
     } 

     // You can also add bindings here if required 
     Binding headerTextBinding = new Binding(); 
     headerTextBinding.Source = this.headerDetails[headername]; 
     headerTextBinding.Path = new PropertyPath("Header"); 
     headerTextBinding.Mode = BindingMode.TwoWay; 
     headerTextBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
     BindingOperations.SetBinding(e.Column, DataGridTextColumn.HeaderProperty, headerTextBinding); 


     e.Column.HeaderStyle = headerCenterStyle; 
     e.Column.DisplayIndex = this.headerDetails[headername].ColumnIndex; //// If you have issues with the index been out of range, change the order of the get/set functions in the model class 
     e.Column.CellStyle = centerStyle;         //// putting the get/set for any fields that are not displayed first will also help to avoid the issue 
     e.Column.IsReadOnly = this.headerDetails[headername].IsReadOnly; 
    } 
    else 
    { 
     e.Column.Visibility = Visibility.Hidden; 
    } 
} 

あなたはあなたが必要とする列をカスタマイズするために、渡された設定を使用することができます。 (MVVMパターンに従っている場合、これはView Modelにあるべきですか?私はリソースを使用して、解決策見つけたと思う)

0

:今では半分働いて

data.RowDetailsTemplate = (DataTemplate)this.Resources["CustomTemplate"]; 

<Window.Resources> 
<DataTemplate x:Key="CustomTemplate"> 
    <DataGrid x:Name="datagrid1" HeadersVisibility="Column" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="False" SelectionMode="Extended" Margin="5,0,5,50" CanUserResizeColumns="False" AutoGenerateColumns="False" VerticalAlignment="Top" IsReadOnly="True" Width="750"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Sub Test Name" Width="*" Binding="{Binding Path=Recipe_Name}"> 
       <DataGridTextColumn.HeaderStyle> 
        <Style TargetType="DataGridColumnHeader"> 
         <Setter Property="HorizontalAlignment" Value="Stretch"/> 
         <Setter Property="HorizontalContentAlignment" Value="Center"/> 
         <Setter Property="FontWeight" Value="Bold" /> 
        </Style> 
       </DataGridTextColumn.HeaderStyle> 
       <DataGridTextColumn.ElementStyle> 
        <Style TargetType="TextBlock"> 
         <Setter Property="HorizontalAlignment" Value="Center" /> 
        </Style> 
       </DataGridTextColumn.ElementStyle> 
      </DataGridTextColumn> 
      <DataGridTextColumn Header="Spec" Width="*" Binding="{Binding Path=Foup}"> 
       <DataGridTextColumn.HeaderStyle> 
        <Style TargetType="DataGridColumnHeader"> 
         <Setter Property="HorizontalAlignment" Value="Stretch"/> 
         <Setter Property="HorizontalContentAlignment" Value="Center"/> 
         <Setter Property="FontWeight" Value="Bold" /> 
        </Style> 
       </DataGridTextColumn.HeaderStyle> 
       <DataGridTextColumn.ElementStyle> 
        <Style TargetType="TextBlock"> 
         <Setter Property="HorizontalAlignment" Value="Center" /> 
        </Style> 
       </DataGridTextColumn.ElementStyle> 
      </DataGridTextColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
</DataTemplate> 

と私のコードでは、私はこれを追加しました。私はリソースへの経験がないので、データをバインドするソリューションを見つけることができません。どうやってやるの?

関連する問題