web-dev-qa-db-fra.com

WPF Datagrid Obtenir la valeur de cellule sélectionnée

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
12

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.

13
Sheridan

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();
15
Drew Sands

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());
    }
}
12
Rushi Soni

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();
    }
5
Charles Clayton
//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'

2
Ketan Dubey

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;
2
Rajesh Thampi

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

1
Thomas Bailey

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;
    }
1
Trikasus

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">
1
ΩmegaMan

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; }
    }
0
Arun kumar