Je veux obtenir de la valeur pour la cellule sélectionnée dans la grille de données, veuillez indiquer à quiconque comment procéder. J'ai utilisé l'événement modifié SelectedCell, comment faire?
dataGrid1.CurrentCell
Veuillez vous référer à la page DataGrid Class sur MSDN. Depuis cette page:
Sélection
Par défaut, la ligne entière est sélectionnée lorsqu'un utilisateur clique sur une cellule dans un DataGrid, et un utilisateur peut sélectionner plusieurs lignes. Vous pouvez définir la propriété SelectionMode pour spécifier si un utilisateur peut sélectionner des cellules, des lignes complètes ou les deux. Définissez la propriété SelectionUnit pour spécifier si plusieurs lignes ou cellules peuvent être sélectionnées, ou uniquement des lignes ou des cellules uniques.
Vous pouvez obtenir des informations sur les cellules sélectionnées dans la propriété SelectedCells . Vous pouvez obtenir des informations sur les cellules pour lesquelles la sélection a changé dans SelectedCellsChangedEventArgs de l'événement SelectedCellsChanged. Appelez les méthodes SelectAllCells ou UnselectAllCells pour sélectionner ou désélectionner par programme toutes les cellules. Pour plus d'informations, consultez Comportement par défaut du clavier et de la souris dans le contrôle DataGrid.
J'ai ajouté des liens vers les propriétés pertinentes pour vous, mais je n'ai plus de temps, alors j'espère que vous pourrez suivre les liens pour obtenir votre solution.
Lorsque j'ai rencontré ce problème, je l'ai abordé comme suit: j'ai créé un DataRowView
, j'ai saisi l'index de la colonne, puis l'ai utilisé dans le ItemArray
de la ligne
DataRowView dataRow = (DataRowView)dataGrid1.SelectedItem;
int index = dataGrid1.CurrentCell.Column.DisplayIndex;
string cellValue = dataRow.Row.ItemArray[index].ToString();
Si vous sélectionnez une seule cellule, obtenez le contenu de cellule sélectionné comme celui-ci
var cellInfo = dataGrid1.SelectedCells[0];
var content = cellInfo.Column.GetCellContent(cellInfo.Item);
Ici, le contenu sera la valeur de vos cellules sélectionnées
Et si vous sélectionnez plusieurs cellules, vous pouvez le faire comme ceci
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());
}
}
Si SelectionUnit="Cell"
essaye ça:
string cellValue = GetSelectedCellValue();
Où:
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();
}
On dirait que ça ne devrait pas être si compliqué, je sais ...
Edit: Cela ne semble pas fonctionner sur les colonnes de type DataGridTemplateColumn
. Vous pouvez également essayer ceci si vos lignes sont composées d'une classe personnalisée et que vous avez attribué un chemin de membre de tri:
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();
}
//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());
Comme WPF fournit une liaison dans DataGrids, cela devrait être plutôt transparent. Cependant, la méthode suivante ne fonctionne que si vous avez utilisé SQLDataAdapter et fourni un chemin de liaison à votre DataGridColoumns. Par exemple. Supposons que la grille de données ci-dessus soit nommée grid1, dont les colonnes de génération automatique sont définies sur false et utilise la liaison pour lier les noms de colonne aux en-têtes. Dans ce cas, nous utilisons la variable 'row' de type 'DataRowView' et y stockons la ligne sélectionnée. Maintenant, utilisez vos chemins de liaison et référencez les colonnes individuelles de la ligne sélectionnée. J'espère que cela t'aides! À votre santé!
PS: fonctionne si SelectionUnit = 'Row'
J'étends la solution de Rushi à la suite (ce qui a résolu le casse-tête pour moi)
var cellInfo = Grid1.SelectedCells[0];
var content = (cellInfo.Column.GetCellContent(cellInfo.Item) as TextBlock).Text;
J'ai eu du mal avec celui-ci pendant longtemps! (Utilisation de VB.NET) Fondamentalement, vous obtenez l'index de ligne et l'index de colonne de la cellule sélectionnée, puis utilisez-le pour accéder à la valeur.
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
Fin de classe
Ce sont 2 méthodes qui peuvent être utilisées pour prendre une valeur de la ligne sélectionnée
/// <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;
}
Ok après avoir fait de l'ingénierie inverse et un peu de poussière de réflexion de lutin, on peut faire cette opération sur SelectedCells
(à tout moment) pour obtenir tout (indépendamment de la sélection sur une ou plusieurs lignes) ) les données d'une à plusieurs cellules sélectionnées:
MessageBox.Show(
string.Join(", ", myGrid.SelectedCells
.Select(cl => cl.Item.GetType()
.GetProperty(cl.Column.SortMemberPath)
.GetValue(cl.Item, null)))
);
J'ai essayé ceci sur les champs de texte (chaîne) uniquement si un champ DateTime doit renvoyer une valeur initier ToString()
. Notez également que SortMemberPath
n'est pas identique à Header
, ce qui devrait toujours fournir la propriété appropriée pour la réflexion.
<DataGrid ItemsSource="{Binding MyData}"
AutoGenerateColumns="True"
Name="myGrid"
IsReadOnly="True"
SelectionUnit="Cell"
SelectionMode="Extended">
vous pouvez également utiliser cette fonction.
public static void GetGridSelectedView(out string tuid, ref DataGrid dataGrid,string Column)
{
try
{
// grid selected row values
var item = dataGrid.SelectedItem as DataRowView;
if (null == item) tuid = null;
if (item.DataView.Count > 0)
{
tuid = item.DataView[dataGrid.SelectedIndex][Column].ToString().Trim();
}
else { tuid = null; }
}
catch (Exception exc) { System.Windows.MessageBox.Show(exc.Message); tuid = null; }
}