2013-10-07 90 views

回答

12

請參閱MSDN上的DataGrid Class頁面。從這個頁面:

選擇

默認情況下,當用戶點擊一個DataGrid一個單元格被選中整行,並且用戶可以選擇多行。您可以設置SelectionMode屬性以指定用戶是可以選擇單元格,全行還是兩者。設置SelectionUnit屬性以指定是否可以選擇多個行或單元格,或者只指定單個行或單元格。

您可以獲取有關從SelectedCells屬性中選擇的單元格的信息。您可以獲取有關SelectedCellsChanged事件的SelectedCellsChangedEventArgs中選擇已更改的單元的信息。調用SelectAllCells或UnselectAllCells方法以編程方式選擇或取消選擇所有單元格。有關更多信息,請參閱DataGrid控件中的默認鍵盤和鼠標行爲。

我已經爲您添加了相關屬性的鏈接,但現在我已經沒有時間了,所以我希望您可以按照鏈接獲取您的解決方案。

+0

在儘可能多地提供給了,那是很大的,這是不是一個真正的答案但一個「在這裏查找」的迴應。 – OmegaMan

+1

從我這裏沒有任何爭論。 – Sheridan

8

如果你選擇這樣

var cellInfo = dataGrid1.SelectedCells[0]; 

var content = cellInfo.Column.GetCellContent(cellInfo.Item); 

這裏的內容只有一個單元格,然後獲得所選單元格的內容將是您所選單元格看重

如果您選擇多個單元格,那麼你可以不喜歡它這

var cellInfos = dataGrid1.SelectedCells; 

var list1 = new List<string>(); 

foreach (DataGridCellInfo cellInfo in cellInfos) 
{ 
    if (cellInfo.IsValid) 
    { 
     //GetCellContent returns FrameworkElement 
     var content= cellInfo.Column.GetCellContent(cellInfo.Item); 

     //Need to add the extra lines of code below to get desired output 

     //get the datacontext from FrameworkElement and typecast to DataRowView 
     var row = (DataRowView)content.DataContext; 

     //ItemArray returns an object array with single element 
     object[] obj = row.Row.ItemArray; 

     //store the obj array in a list or Arraylist for later use 
     list1.Add(obj[0].ToString()); 
    } 
} 
+0

A小調除了單細胞溶液中,內容應改爲正文塊這樣變種含量=(cellInfo.Column.GetCellContent(cellInfo.Item)作爲TextBlock的)。文本; –

12

當我面對這個問題,我走近它是這樣的: 我創建了一個DataRowView,抓起列IND當然,再使用,在該行的ItemArray

DataRowView dataRow = (DataRowView)dataGrid1.SelectedItem; 
int index = dataGrid1.CurrentCell.Column.DisplayIndex; 
string cellValue = dataRow.Row.ItemArray[index].ToString(); 
+2

當'SelectionUnit'設置爲'DataGridSelectionUnit.FullRow' –

+0

@Bahman_Aries這隻能見我的時候'SelectionUnit'是'Cell'答案。 –

+0

三江源非常約翰說,你解決了我的大問題! – DumpsterDiver

1

這些都是可以用來選定行取一個值

/// <summary> 
    /// Take a value from a the selected row of a DataGrid 
    /// ATTENTION : The column's index is absolute : if the DataGrid is reorganized by the user, 
    /// the index must change 
    /// </summary> 
    /// <param name="dGrid">The DataGrid where we take the value</param> 
    /// <param name="columnIndex">The value's line index</param> 
    /// <returns>The value contained in the selected line or an empty string if nothing is selected</returns> 
    public static string getDataGridValueAt(DataGrid dGrid, int columnIndex) 
    { 
     if (dGrid.SelectedItem == null) 
      return ""; 
     string str = dGrid.SelectedItem.ToString(); // Take the selected line 
     str = str.Replace("}", "").Trim().Replace("{", "").Trim(); // Delete useless characters 
     if (columnIndex < 0 || columnIndex >= str.Split(',').Length) // case where the index can't be used 
      return ""; 
     str = str.Split(',')[columnIndex].Trim(); 
     str = str.Split('=')[1].Trim(); 
     return str; 
    } 

    /// <summary> 
    /// Take a value from a the selected row of a DataGrid 
    /// </summary> 
    /// <param name="dGrid">The DataGrid where we take the value.</param> 
    /// <param name="columnName">The column's name of the searched value. Be careful, the parameter must be the same as the shown on the dataGrid</param> 
    /// <returns>The value contained in the selected line or an empty string if nothing is selected or if the column doesn't exist</returns> 
    public static string getDataGridValueAt(DataGrid dGrid, string columnName) 
    { 
     if (dGrid.SelectedItem == null) 
      return ""; 
     for (int i = 0; i < columnName.Length; i++) 
      if (columnName.ElementAt(i) == '_') 
      { 
       columnName = columnName.Insert(i, "_"); 
       i++; 
      } 
     string str = dGrid.SelectedItem.ToString(); // Get the selected Line 
     str = str.Replace("}", "").Trim().Replace("{", "").Trim(); // Remove useless characters 
     for (int i = 0; i < str.Split(',').Length; i++) 
      if (str.Split(',')[i].Trim().Split('=')[0].Trim() == columnName) // Check if the searched column exists in the dataGrid. 
       return str.Split(',')[i].Trim().Split('=')[1].Trim(); 
     return str; 
    } 
4

如果SelectionUnit="Cell"嘗試這2種方法:

string cellValue = GetSelectedCellValue(); 

其中:

public string GetSelectedCellValue() 
    { 
     DataGridCellInfo cellInfo = MyDataGrid.SelectedCells[0]; 
     if (cellInfo == null) return null; 

     DataGridBoundColumn column = cellInfo.Column as DataGridBoundColumn; 
     if (column == null) return null; 

     FrameworkElement element = new FrameworkElement() { DataContext = cellInfo.Item }; 
     BindingOperations.SetBinding(element, TagProperty, column.Binding); 

     return element.Tag.ToString(); 
    } 

好像它不應該是複雜的,我知道......

編輯:這似乎並不對DataGridTemplateColumn類型的列上工作。你也可以試試這個,如果你的行是由一個自定義類的,你已經分配了一個排序成員路徑:

public string GetSelectedCellValue() 
    { 
     DataGridCellInfo cells = MyDataGrid.SelectedCells[0]; 

     YourRowClass item = cells.Item as YourRowClass; 
     string columnName = cells.Column.SortMemberPath; 

     if (item == null || columnName == null) return null; 

     object result = item.GetType().GetProperty(columnName).GetValue(item, null); 

     if (result == null) return null; 

     return result.ToString(); 
    } 
1

我這一個很長一段時間掙扎! (使用VB.NET)基本上你會得到所選單元格的行索引和列索引,然後使用它來訪問該值。

Private Sub LineListDataGrid_SelectedCellsChanged(sender As Object, e As SelectedCellsChangedEventArgs) Handles LineListDataGrid.SelectedCellsChanged 

    Dim colInd As Integer = LineListDataGrid.CurrentCell.Column.DisplayIndex 

    Dim rowInd As Integer = LineListDataGrid.Items.IndexOf(LineListDataGrid.CurrentItem) 

    Dim item As String 

    Try 
     item = LLDB.LineList.Rows(rowInd)(colInd) 
    Catch 
     Exit Sub 
    End Try 

End Sub 

末級

1
//Xaml Code 
<DataGrid.Columns> 
<DataGridTextColumn Binding="{Binding Path=Date, Converter={StaticResource dateconverter}, Mode=OneWay}" Header="Date" Width="100"/> 
<DataGridTextColumn Binding="{Binding Path=Prescription}" Header="Prescription" Width="900"/> 
</DataGrid.Columns> 

//C# Code 
DataRowView row = (DataRowView)grid1.SelectedItem; 
MessageBox.Show(row["Prescription"].toString() + " " + row["Date"].toString()); 

如WPF在DataGrid中提供結合,這應該是相當透明的。但是,下面的方法只適用,如果您使用的SqlDataAdapter並提供給您的DataGridColoumns一個綁定路徑。例如。比方說,上述數據網格被命名爲GRID1,它具有自動生成設置爲false列,並且是使用綁定綁定列名頭。在這種情況下,我們使用'DataRowView'類型的'row'變量並將選中的行存儲在其中。現在,使用綁定路徑,並引用所選行的單個列。 希望這有助於!乾杯!

PS:工作如果SelectionUnit =「行」

0

做逆向工程和反思的一點仙塵OK之後,一個可以做SelectedCells這個操作(在任何點),以獲得所有(無論在一行或多行)從一個數據選擇許多選定單元格:

MessageBox.Show(

string.Join(", ", myGrid.SelectedCells 
         .Select(cl => cl.Item.GetType() 
              .GetProperty(cl.Column.SortMemberPath) 
              .GetValue(cl.Item, null))) 

       ); 

我想這對文本(字符串),雖然只有一個DateTime字段應該返回發起ToString()值的字段。還要注意的是SortMemberPath是不一樣的Header因此,應始終提供的財產,以反映過的。

<DataGrid ItemsSource="{Binding MyData}"      
      AutoGenerateColumns="True" 
      Name="myGrid" 
      IsReadOnly="True" 
      SelectionUnit="Cell" 
      SelectionMode="Extended"> 
0

我通過延伸到如是以下解決方案(其中解決了這個難題對我來說)

var cellInfo = Grid1.SelectedCells[0]; 
var content = (cellInfo.Column.GetCellContent(cellInfo.Item) as TextBlock).Text; 
相關問題