我想獲取datagrid中選定單元格的值,請任何人告訴如何執行此操作。我用SelectedCell改變了事件,我該怎麼做?WPF Datagrid獲取選定的單元格值
dataGrid1.CurrentCell
我想獲取datagrid中選定單元格的值,請任何人告訴如何執行此操作。我用SelectedCell改變了事件,我該怎麼做?WPF Datagrid獲取選定的單元格值
dataGrid1.CurrentCell
請參閱MSDN上的DataGrid Class頁面。從這個頁面:
選擇
默認情況下,當用戶點擊一個DataGrid一個單元格被選中整行,並且用戶可以選擇多行。您可以設置SelectionMode屬性以指定用戶是可以選擇單元格,全行還是兩者。設置SelectionUnit屬性以指定是否可以選擇多個行或單元格,或者只指定單個行或單元格。
您可以獲取有關從SelectedCells屬性中選擇的單元格的信息。您可以獲取有關SelectedCellsChanged事件的SelectedCellsChangedEventArgs中選擇已更改的單元的信息。調用SelectAllCells或UnselectAllCells方法以編程方式選擇或取消選擇所有單元格。有關更多信息,請參閱DataGrid控件中的默認鍵盤和鼠標行爲。
我已經爲您添加了相關屬性的鏈接,但現在我已經沒有時間了,所以我希望您可以按照鏈接獲取您的解決方案。
如果你選擇這樣
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());
}
}
A小調除了單細胞溶液中,內容應改爲正文塊這樣變種含量=(cellInfo.Column.GetCellContent(cellInfo.Item)作爲TextBlock的)。文本; –
當我面對這個問題,我走近它是這樣的: 我創建了一個DataRowView
,抓起列IND當然,再使用,在該行的ItemArray
DataRowView dataRow = (DataRowView)dataGrid1.SelectedItem;
int index = dataGrid1.CurrentCell.Column.DisplayIndex;
string cellValue = dataRow.Row.ItemArray[index].ToString();
當'SelectionUnit'設置爲'DataGridSelectionUnit.FullRow' –
@Bahman_Aries這隻能見我的時候'SelectionUnit'是'Cell'答案。 –
三江源非常約翰說,你解決了我的大問題! – DumpsterDiver
這些都是可以用來選定行取一個值
/// <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;
}
如果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();
}
我這一個很長一段時間掙扎! (使用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
末級
//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 =「行」
做逆向工程和反思的一點仙塵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">
我通過延伸到如是以下解決方案(其中解決了這個難題對我來說)
var cellInfo = Grid1.SelectedCells[0];
var content = (cellInfo.Column.GetCellContent(cellInfo.Item) as TextBlock).Text;
在儘可能多地提供給了,那是很大的,這是不是一個真正的答案但一個「在這裏查找」的迴應。 – OmegaMan
從我這裏沒有任何爭論。 – Sheridan