2010-10-12 9 views
52

Tôi có một DataGrid, được liên kết với bảng Cơ sở dữ liệu, tôi cần lấy nội dung của hàng đã chọn trong DataGrid, ví dụ, tôi muốn hiển thị nội dung của hàng đã chọn MessageBox.Lấy mục hàng đã chọn trong DataGrid WPF

Ví dụ về DataGrid:

enter image description here

Vì vậy, nếu tôi chọn hàng thứ hai, tôi MessageBox có để hiển thị một cái gì đó như: 646 Jim Biology.

Trả lời

109

Bạn có thể sử dụng thuộc tính SelectedItem để nhận đối tượng được chọn hiện tại, sau đó bạn có thể đưa vào đúng loại. Ví dụ: nếu DataGrid của bạn bị ràng buộc với bộ sưu tập đối tượng Khách hàng, bạn có thể thực hiện việc này:

Hoặc bạn có thể liên kết SelectedItem với lớp nguồn hoặc ViewModel.

<Grid DataContext="MyViewModel"> 
    <DataGrid ItemsSource="{Binding Path=Customers}" 
       SelectedItem="{Binding Path=SelectedCustomer, Mode=TwoWay}"/> 
</Grid>  
+1

Cảm ơn bạn, người đầu tiên làm việc tuyệt vời! –

+2

Cảm ơn bạn, thứ hai cũng hoạt động rất tốt! :) – Sam

+1

Thứ hai là chính xác những gì tôi đang tìm kiếm. Cảm ơn! – James

15

Nếu bạn đang sử dụng mô hình MVVM bạn có thể gắn một tài sản của VM của bạn SelectedRecord với SelectedItem của DataGrid, cách này bạn luôn có SelectedValue trong bạn VM. Nếu không, bạn nên sử dụng thuộc tính SelectedIndex của DataGrid.

+0

tôi không sử dụng MVVM, tôi chỉ bắt đầu với WPF/C# /. MẠNG LƯỚI. Nếu tôi viết «ContentDataGrid.SelectedIndex», tôi nhận chỉ mục của hàng đã chọn trong DataGrid và tôi không cần chỉ mục, nhưng giá trị thực, chẳng hạn như «646 Jim Biology». Vì vậy, làm thế nào tôi có thể nhận được nó? –

+0

Bạn nên xem xét sử dụng một đối tượng được gắn kết để bạn có thể ràng buộc thuộc tính SelectedItem của datagrid. Trong trường hợp của bạn, bạn nên cố gắng điều hướng đến các thuộc tính Datagrid để tìm hiểu xem nó có lưu trữ thuộc tính item đã chọn hay không. – ema

+0

+1. Câu đầu tiên đó là * chính xác * những gì tôi đang tìm kiếm! – TarkaDaal

12
public IEnumerable<DataGridRow> GetDataGridRows(DataGrid grid) 
{ 
    var itemsSource = grid.ItemsSource as IEnumerable; 
    if (null == itemsSource) yield return null; 
    foreach (var item in itemsSource) 
    { 
     var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow; 
     if (null != row) yield return row; 
    } 
} 

private void DataGrid_Details_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    try 
    {   
     var row_list = GetDataGridRows(DataGrid_Details); 
     foreach (DataGridRow single_row in row_lis) 
     { 
      if (single_row.IsSelected == true) 
      { 
       MessageBox.Show("the row no."+single_row .GetIndex().ToString()+ " is selected!"); 
      } 
     } 

    } 
    catch { } 
} 
+1

Giải pháp thực sự tốt! Cảm ơn nhiều! – Mafii

2

Vâng, tôi sẽ đưa giải pháp tương tự đó là làm việc tốt cho tôi.

private void DataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      try 
      { 
       if (DataGrid1.SelectedItem != null) 
       { 
        if (DataGrid1.SelectedItem is YouCustomClass) 
        { 
         var row = (YouCustomClass)DataGrid1.SelectedItem; 

         if (row != null) 
         { 
          // Do something... 

          // ButtonSaveData.IsEnabled = true; 

          // LabelName.Content = row.Name; 

         } 
        } 
       } 
      } 
      catch (Exception) 
      { 
      } 
     } 
0

nếu tôi chọn hàng thứ hai -

Dim jason As DataRowView 


    jason = dg1.SelectedItem 

    noteText.Text = jason.Item(0).ToString() 

noteText sẽ 646 Đây là VB, nhưng bạn sẽ có được nó.

1
private void Fetching_Record_Grid_MouseDoubleClick_1(object sender, MouseButtonEventArgs e) 
{ 
    IInputElement element = e.MouseDevice.DirectlyOver; 
    if (element != null && element is FrameworkElement) 
    { 
     if (((FrameworkElement)element).Parent is DataGridCell) 
     { 
      var grid = sender as DataGrid; 
      if (grid != null && grid.SelectedItems != null && grid.SelectedItems.Count == 1) 
      { 
       //var rowView = grid.SelectedItem as DataRowView; 
       try 
       { 
        Station station = (Station)grid.SelectedItem; 
        id_txt.Text = station.StationID.Trim() ; 
        description_txt.Text = station.Description.Trim(); 
       } 
       catch 
       { 

       } 
      } 
     } 
    } 
} 
+1

Bạn có thể giải thích mã của mình không? – Rico

2

Điều này khá đơn giản trong DataGrid dg và hạng mục này được điền vào datagrid và listblock1 là khung cơ bản.

private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     try 
     { 
      var row_list = (Item)dg.SelectedItem; 
      listblock1.Content = "You Selected: " + row_list.FirstName + " " + row_list.LastName; 
     } 
     catch { } 

    } 
    public class Item 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
    } 
1

Chỉ phát hiện ra điều này sau khi tôi đã thử câu trả lời của Fara nhưng nó không hoạt động trên dự án của tôi. Chỉ cần kéo cột từ cửa sổ Nguồn dữ liệu và thả vào Nhãn hoặc Hộp văn bản.

1

sử dụng lớp Model của bạn để có được giá trị hàng đã chọn từ DataGrid như,

 XDocument xmlDoc = XDocument.Load(filepath); 

     if (tablet_DG.SelectedValue == null) 
     { 
      MessageBox.Show("select any record from list..!", "select atleast one record", MessageBoxButton.OKCancel, MessageBoxImage.Warning); 
     } 
     else 
     { 
      try 
      { 
       string tabletID = ""; 

       /*here i have used my model class named as TabletMode*/ 

       var row_list = (TabletModel)tablet_DG.SelectedItem; 
       tabletID= row_list.TabletID; 

       var items = from item in xmlDoc.Descendants("Tablet") 
          where item.Element("TabletID").Value == tabletID 
          select item; 

       foreach (var item in items) 
       { 
        item.SetElementValue("Instance",row_list.Instance); 
        item.SetElementValue("Database",row_list.Database); 
       } 

       xmlDoc.Save(filepath); 
       MessageBox.Show("Details Updated..!" 
       + Environment.NewLine + "TabletId: " +row_list.TabletID + Environment.NewLine 
       + "Instance:" + row_list.Instance + Environment.NewLine + "Database:" + row_list.Database, "", MessageBoxButton.YesNoCancel, MessageBoxImage.Information); 
      } 

      catch (Exception ex) 
      { 
       MessageBox.Show(ex.StackTrace); 
      } 
     } 
1

Bạn cũng có thể:

DataRowView row = dataGrid.SelectedItem as DataRowView; 
MessageBox.Show(row.Row.ItemArray[1].ToString());