2013-01-22 2 views
0

WPF 응용 프로그램에서 DataGrid를 구성하고 있습니다. Datagrid의 ItemSourceIEnumerable 컬렉션으로 묶입니다. 내 프로젝트의 ViewModel을 사용하지 않습니다. 내 DataGrid itemsource를 DataGrid에 바인딩하면 즉시 열 머리글과 행 값을 가져옵니다.Datagrid의 동적 열 머리글 및 머리글 개수 WPF

헤더가 없습니다. 그것은 아무것도 될 수 있습니다. 그리드의 DataGrid에서 선택한 행의 자세한 정보를 표시해야합니다.

이렇게하려면 그리드의 텍스트 블록에 SelectedItem.HeaderName을 bing해야합니다. 하지만 여기서 문제는 헤더의 이름을 모르겠다는 것입니다. 그래서 나는 단지 SelectedItem.Headername을 하드 코드 할 수 없다.

그리고 열의 수는 각각 다를 수 있습니다. 따라서 내 DataGrid의 행을 선택하면 세부적인 뷰에서 Dynamic Name Header 이름에 해당 값을 지정해야합니다.

현재로서는 다음과 같이 내 xaml에서 결과를 harcoded 및 보았습니다. 왜냐하면 특정 파일에 대해 각각의 열 머리글을 알고 있기 때문에

<Label HorizontalAlignment="Stretch" 
     VerticalAlignment="Center" 
     Grid.Row="0" 
     Grid.Column="0">Header2: 
</Label> 

<TextBlock Grid.Row="0" 
      Grid.Column="1" 
      Name="Header2" 
      Text="{Binding SelectedItem.date, ElementName=dataGrid1}" 
      Width="auto" 
      Height="auto" 
      HorizontalAlignment="Stretch" 
      VerticalAlignment="Center" /> 

<Label Grid.Row="0" 
     Grid.Column="2" 
     VerticalAlignment="Center">Header3:</Label> 

<TextBlock Grid.Row="0" 
      Grid.Column="3" 
      Name="username" 
      Text="{Binding SelectedItem.Header3, ElementName=dataGrid1}" 
      Width="auto" 
      Height="auto" 
      HorizontalAlignment="Stretch" 
      VerticalAlignment="Center" /> 

<Label Grid.Row="0" 
     Grid.Column="4" 
     VerticalAlignment="Center">Header4:</Label> 

<TextBlock Grid.Row="0" 
      Grid.Column="5" 
      Name="level" 
      Text="{Binding SelectedItem.header4, ElementName=dataGrid1}" 
      Width="auto" 
      Height="auto" 
      HorizontalAlignment="Stretch" 
      VerticalAlignment="Center" /> 

<Label Grid.Row="1" 
     Grid.Column="0" 
     VerticalAlignment="Center">Header5:</Label> 

<TextBlock Grid.Row="1" 
      Grid.Column="1" 
      Name="logger" 
      Text="{Binding SelectedItem.header5, ElementName=dataGrid1}" 
      Width="auto" 
      Height="auto" 
      HorizontalAlignment="Stretch" 
      VerticalAlignment="Center" /> 

<Label Grid.Row="1" 
     Grid.Column="2" 
     VerticalAlignment="Center">Headr6:</Label> 

<TextBlock Grid.Row="1" 
      Grid.Column="3" 
      Name="thread" 
      Text="{Binding SelectedItem.header6, ElementName=dataGrid1}" 
      Width="auto" 
      Height="auto" 
      HorizontalAlignment="Stretch" 
      VerticalAlignment="Center" /> 

나는이 작업을 수행하는 방법을 알 수 없었기 때문에. 나는 너를 도와 주려고 노력하면 기뻐할거야. 이 동적 열 생성과 관련된 몇 가지 개념, Count, 동적 열 머리글을 UI의 다른 컨트롤에 지정하는 방법을 제안하십시오. 미리 감사드립니다.

+0

내가 당신을 잘 이해한다면, DataGrid 정보를 표시하는 Grid 컨텐츠도 동적이어야합니다. 이 경우 코드를 사용하는 것이 더 좋은 방법입니다. – HichemSeeSharp

+0

@HichemC : 맞음 .. :) – BinaryMee

답변

0

DataGrid에서 컬렉션을 만든 DataGrid 헤더 및 개체 속성에 따라 그리드 (TextBlock + TextBox clollection)의 동적 생성이 포함 된 작은 프로젝트를 만들었습니다. 그것이 당신이 찾고있는 것이기를 바랍니다. 당신이 my SkyDrive

XAML에서 그것을 donwload 수 있습니다

<Grid> 
     <StackPanel> 
     <StackPanel x:Name="myStackPanel" Orientation="Vertical"></StackPanel> 
      <DataGrid x:Name="myDataGrid" ItemsSource="{Binding MySource}" AutoGenerateColumns="True"> 
     </DataGrid> 

     </StackPanel> 
    </Grid> 

내가로드 이벤트 처리기에서이 설정 한 :

for (int i = 0; i < myDataGrid.Columns.Count; i++) 
        { 
         var childStackPanel = new StackPanel { Orientation = Orientation.Horizontal }; 

         var myTextBlock = new TextBlock { Text = myDataGrid.Columns[i].Header + " : " }; 

         var myTextBox = new TextBox { Width = 200 }; 

         Type myType = typeof(Text); 
         IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties()); 
         myTextBox.SetBinding(TextBox.TextProperty, 
               new Binding("SelectedItem." + props[i].Name) { ElementName = "myDataGrid" }); 
         childStackPanel.Children.Add(myTextBlock); 
         childStackPanel.Children.Add(myTextBox); 
         myStackPanel.Children.Add(childStackPanel); 
        } 

텍스트 클래스 :

public class TranslationText 
    { 
     private string _translation; 
     private bool _isTranslated; 

     public string Translation 
     { 
      get { return _translation; } 
      set 
      { 
       _translation = value; 
      } 
     } 

     public bool IsTranslated 
     { 
      get { return _isTranslated; } 
      set 
      { 
       _isTranslated = value; 
      } 
     } 

    } 
+0

감사합니다 .. .. 내 문제를 해결했습니다 .. :) 한 가지 더 의심 스럽습니다. MessageBox.Show (dataGrid1.Columns [i] .Header.ToString() + (new Binding (" SelectedItem "+ dataGrid1.Columns [i] .Header.ToString()) {ElementName ="dataGrid1 "}})); 그것은 메시지 상자에 헤더와 그 선택된 값을 표시합니다. 올바른 헤더를 얻고 있습니다. 그러나 해당 값을 얻지 못하고 있습니다. 이걸 도와 줄 수 있니? – BinaryMee

+0

내 대답이 기본 질문을 해결하면 답변으로 표시해야합니다. 두 번째 질문은 다소 혼란 스럽습니다. "해당 셀이있는 머리글"을 표시해야합니까? – HichemSeeSharp