2014-02-11 2 views
2

같은 행의 일부 체크 박스가 선택되면 텍스트 상자에서 3 개의 값을 가져 오기위한 코드를 작성하려고합니다. 누구든지 쉬운 (또는 어려운) 방법을 알고 있습니까?체크 박스가 DataGrid에서 체크 된 경우 전체 행 값 가져 오기 C#

내 데이터 그리드는 다음과 같습니다 : enter image description here

나는 그 후 나는 그 일부 문자열을 얻는 메소드를 호출하고있어, 어딘가에 파일 시스템의 특정 유형 (XML.config)의 파일을 발견로드 버튼이 파일, 하위 문자열을 찾아 3 개의 분리 된 목록에 넣으십시오. 이러한 값은 Type, MapTo 및 Name과 같은 DataGrid에 있습니다. 나는 1 ObservableCollection에 모든 3리스트를 넣어이 작업을 수행하고 그 후 나는이 같은 데이터 그리드 해당 ObservalableCollection을 보내고있다 :

ObservableCollection<Tuple<string, string, string>> _obsCollection = new ObservableCollection<Tuple<string, string, string>>(); 
public ObservableCollection<Tuple<string, string, string>> MyObsCollection 
{ 
    get { return _obsCollection; } 
} 
tabela.ItemsSource = _obsCollection; 

이 바인딩을 보여줍니다 XAML 코드 :

<DataGrid Grid.Column="0" AutoGenerateColumns="False" Height="206" HorizontalAlignment="Left" Margin="12,265,0,0" Name="tabela" VerticalAlignment="Top" Width="556" SelectionChanged="tabela_SelectionChanged" Grid.RowSpan="2" ItemsSource="Binding MyObsCollection"> 
      <DataGrid.Columns> 

       <DataGridTextColumn Header="Type" Width="122" Binding="{Binding Item1}"/> 
       <DataGridTextColumn Header="MapTo" Width="122" Binding="{Binding Item2}"/> 
       <DataGridTextColumn Header="Name" Width="121" Binding="{Binding Item3}"/> 

       <DataGridTemplateColumn Header="Controller"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <CheckBox IsChecked="{Binding DataGridChecked}"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 

       <DataGridTemplateColumn Header="Service"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <CheckBox IsChecked="{Binding DataGridChecked}"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 

       <DataGridTemplateColumn Header="Injection"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <CheckBox IsChecked="{Binding DataGridChecked}"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 

      </DataGrid.Columns> 

     </DataGrid> 

은 내가 'm 실제로 시도하는 것은 당신이 3 개의 열 모두를 선택하는 것을 볼 수있는 체크 박스를 포함하는 것을 반복하는 것입니다. 그리고 같은 행에 3이 선택되면 그 행에서 3 개의 문자열 값을 어떤 변수로 보낼 필요가 있습니다. 누구든지이 문제를 해결할 수 있습니다. 예를 들어 데이터 그리드의 체크 박스에서 isSelected 속성을 얻는 방법을 모르겠습니다. 많은 연구를하고 있었고 DataGridView에 대한 예는 찾을 수있었습니다. DataGrid에는 거의 아무것도 없었습니다. 대신 Tuple 자신의 클래스를 생성 사용

+0

'ObservableCollection에 <튜플 <문자열, 문자열, 문자열을 >>'- 당신은 정말 그 대신에 적절한 강력한 형식의 데이터 모델을 만들어야합니다 괴물, 제발. –

+0

@HighCore는 의견을 보내 주셔서 감사합니다 ... 저는 아직 초보자이며이를 수행하는 방법을 모르겠습니다 ... 데이터 모델을 만드는 데 유용한 링크 나 튜토리얼을 알고 있습니까? 나는 이런 종류의 코드가 지저분하다는 것을 알고 있지만 나는 여전히 미친 것들을 시도하고 그들을 탐구하고있다. –

답변

2

, 당신이 열로 표시 할 모든 속성 RowData 말 : 당신의 유형을

public ObservableCollection<RowData> MyObsCollection { get { .... } } 

를 사용하는

public class RowData: INotifyPropertyChanged 
{ 
    //implement INotifyPropertyChanged 

    public string Type { get; set; } 
    public string MapTo { get; set; } 
    public string Name { get; set; } 
    public bool Controller { get; set; } 
    public bool Service { get; set; } 
    public bool Injection { get; set; } 
} 

변화 ObservableCollection과에 AutoGenerateColumns="True"을 설정 DataGrid

<DataGrid 
    Grid.Column="0" 
    Grid.RowSpan="2" 
    AutoGenerateColumns="True" 
    Height="206" 
    Width="556" 
    HorizontalAlignment="Left" 
    Margin="12,265,0,0" 
    Name="tabela" 
    VerticalAlignment="Top" 
    SelectionChanged="tabela_SelectionChanged" 
    ItemsSource="{Binding MyObsCollection}"/> 

후 3 CheckBoxes의 당신이 선택 항목을 얻을 수는 수행

var selectedList = MyObsCollection.Where(n => n.Controller || n.Service || n.Injection).ToList(); 
+0

@ dkozi 나는 그런 모든 것을했지만 지금은 하나의 행만있는 빈 DataGrid를 얻습니다. 내가 사용하는대로 텍스트 행의 모든 ​​바인딩을 남겨 두어야하며 컨트롤러, 서비스 및 삽입 속성으로 확인란 행을 바인딩해야합니까? –

+1

바인딩이 잘못되었으므로 새 이름이 생겼으므로 Item1, Item2 및 Item3은 더 이상 바인딩에 사용할 수 없습니다. 도와 주셔서 대단히 감사합니다. –

+0

문제 없습니다. 다행히 도왔다. – dkozl