2014-10-09 103 views
0

想要獲取選定的行項目。 我一直readed,它應該工作:在DataGrid中獲取選定的行項目WPF不起作用

<DataGrid ItemsSource="{Binding Path=Customers}" 
       SelectedItem="{Binding Path=SelectedCustomer, Mode=TwoWay}"/> 

Customer customer = (Customer)myDataGrid.SelectedItem; 
  1. 在第一個XAML - 我把它,它不錯誤或東西,我只是不知道如何使用它。如何在C#代碼我可以得到選定的行?

  2. 在C#代碼中出現錯誤。該視覺工作室不存在客戶。

    我會很感激的幫助。 :) 謝謝。

+0

的結合點'SelectedItem'是能夠通過你的'SelectedCustomer'財產代碼來訪問它,而不是通過DataGrid後面。在「SelectedCustomer」的setter中放置一個斷點,並檢查它是否正常工作。 – Natxo 2014-10-09 07:46:30

+0

*我只是不知道如何使用它* ...它不*我們的工作來教你如何編寫WPF。您需要使用書籍或外部資源自行學習。我們的工作是幫助您解決*您在程序中遇到的特定問題*。 – Sheridan 2014-10-09 07:51:26

回答

0

很難知道你到底想要什麼:)但是這裏是一個例子,我只是想知道如何將信息拖出數據網格。 沒有在其中植入很多的綁定,所以這是純粹的獲取信息。

的XAML

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <DataGrid Grid.Row="0" Name="dg"/> 
    <Button Grid.Row="1" Name="btn" Click="btn_Click" /> 

</Grid> 

代碼隱藏

List<SomeInfo> list = new List<SomeInfo>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     list.Add(new SomeInfo() { Name = "PC", Description = "Computer", ID = 1 }); 
     list.Add(new SomeInfo() { Name = "PS", Description = "Playstation", ID = 2 }); 
     list.Add(new SomeInfo() { Name = "XB", Description = "Xbox", ID = 3 }); 
     this.dg.ItemsSource = list; 
    } 

    public class SomeInfo 
    { 
     public string Name { get; set; } 
     public string Description { get; set; } 
     public int ID { get; set; } 
    } 

    private void btn_Click(object sender, RoutedEventArgs e) 
    { 
     if (dg.SelectedIndex != -1) 
     { 
      DataGrid dataGrid = sender as DataGrid; 
      DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(dg.SelectedIndex); 
      DataGridCell RowColumn = dg.Columns[0].GetCellContent(row).Parent as DataGridCell; 
      btn.Content = ((TextBlock)RowColumn.Content).Text; 
     } 
    } 

的btn_click做所有收集信息的東西,其中最後2使我的數據網格進行測試。

希望它會幫助你:)

------------------編輯-------------- ------------從本評論下面

是你只需要

private void btn_Click(object sender, RoutedEventArgs e) 
    { 
     if (dg.SelectedIndex != -1) 
     { 
      DataGrid dataGrid = sender as DataGrid; 
      DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(dg.SelectedIndex); 
      DataGridCell RowColumn = dg.Columns[0].GetCellContent(row).Parent as DataGridCell; 
      btn.Content = ((TextBlock)RowColumn.Content).Text; 
     } 
    } 

dg = your datagrid 
dg.Columns[0] = change 0 into what column you want 
info from btn.Content = what you want the content to be 

什麼--------------編輯2 ------------ 要獲得選定行的索引,所有你需要的是

  int index = dg.SelectedIndex; 
      btn.Content = index; 

,或者如果你不想存儲integar

  btn.Content = dg.SelectedIndex; 
+0

對不起,但我不明白在我的代碼中寫什麼..有很多變量,不存在於我的項目.. – 2014-10-09 23:28:03

+0

private void btn_Click(object sender,RoutedEventArgs e) { if(dg.SelectedIndex!= - 1) DataGrid dataGrid = sender作爲DataGrid; DataGridRow row =(DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(dg.SelectedIndex); DataGridCell RowColumn = dg.Columns [0] .GetCellContent(row).Parent as DataGridCell; btn.Content =((TextBlock)RowColumn.Content).Text; }} DG =您的DataGrid dg.Columns [0] = 0變化到你想從信息哪一列 btn.Content =你想要的內容要 – BlackStarHH 2014-10-10 06:11:31

+0

我將編輯後,所以你可以看到什麼我剛纔寫的更好的例子 – BlackStarHH 2014-10-10 06:12:41

0

該網格定義非常不完整。 理事會明確表示,與個人結合

在這種情況下,構成它的所有列我使用的事件的DoubleClick,但你必須選擇合適的事件,你

通過代碼例如試試這個:

在XAML添加:

<DataGrid x:Name="MyDataGrid" x:FieldModifier="public" MouseDoubleClick="MyDataGrid_MouseDoubleClick" ItemsSource="{Binding Path=Customers}" 
       SelectedItem="{Binding Path=SelectedCustomer, Mode=TwoWay}"/> 

而且在後面的C#代碼如下:

private void MyDataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
     { 
      if (sender != null) 
      { 
       DataGrid grid = sender as DataGrid; 
       if (grid != null && grid.SelectedItems != null && grid.SelectedItems.Count == 1) 
       { 

         var selectedRow = grid.SelectedItem as MyObject; 

         try 
         { 
          Mouse.OverrideCursor = Cursors.Wait; 

          //TODO YOUR OPERATION ON selectdRow 
         } 
         finally 
         { 
          Mouse.OverrideCursor = null; 
         } 

       } 
      } 
     }