Подтвердить что ты не робот

WPF Datagrid получает выбранную стоимость ячейки

Я хочу получить значение для выбранной ячейки в datagrid, пожалуйста, кто-нибудь расскажет, как это сделать. я использовал событие SelectedCell с изменением, как я могу это сделать?

dataGrid1.CurrentCell
4b9b3361

Ответ 1

Обратитесь к странице DataGrid Class на MSDN. С этой страницы:

Выбор

По умолчанию вся строка выбирается, когда пользователь щелкает ячейку в DataGrid, и пользователь может выбрать несколько строк. Вы можете установить свойство SelectionMode, чтобы указать, может ли пользователь выбирать ячейки, полные строки или и то, и другое. Задайте свойство SelectionUnit, чтобы указать, можно ли выбрать несколько строк или ячеек, или только отдельные строки или ячейки.

Вы можете получить информацию о ячейках, которые выбраны из свойства SelectedCells. Вы можете получить информацию о ячейках, для которых выбор изменился в SelectedCellsChangedEventArgs события SelectedCellsChanged. Вызовите методы SelectAllCells или UnselectAllCells для программного выбора или отмены выбора всех ячеек. Дополнительные сведения см. В разделе По умолчанию клавиатура и поведение мыши в элементе управления DataGrid.

Я добавил ссылки на соответствующие свойства для вас, но у меня нет времени, поэтому я надеюсь, что вы сможете следить за ссылками, чтобы получить свое решение.

Ответ 2

Когда я столкнулся с этой проблемой, я подошел к ней так: Я создал DataRowView, схватил индекс столбца, а затем использовал это в строке ItemArray

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

Ответ 3

Если вы выбираете только одну ячейку, тогда получите выбранный контент ячейки, подобный этому

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

Ответ 4

Если SelectionUnit="Cell" попробуйте следующее:

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

Ответ 5

//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 обеспечивает привязку в DataGrids, это должно быть довольно прозрачным. Однако следующий метод работает, только если вы использовали SQLDataAdapter и предоставили путь привязки к вашим DataGridColoumns. Напр. Пусть говорят, что вышеупомянутый datagrid называется grid1, который автоматически генерирует столбцы, заданные как false, и использует привязку для привязки имен столбцов к заголовкам. В этом случае мы используем переменную 'row' типа 'DataRowView' и сохраняем в ней выбранную строку. Теперь используйте ваши пути привязки и укажите отдельные столбцы выбранной строки. Надеюсь это поможет! Ура!

PS: Работает, если SelectionUnit = 'Row'

Ответ 6

Я расширяю решение от Rushi до следующего (который решил загадку для меня)

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

Ответ 7

Это два метода, которые можно использовать для получения значения из выбранной строки

    /// <summary>
    /// Take a value from a the selected row of a DataGrid
    /// ATTENTION : The column 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 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 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;
    }

Ответ 8

Я долго боролся с этим! (Использование 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

Конечный класс

Ответ 9

Хорошо после выполнения обратной инженерии и небольшой пиксельной пыли отражения, можно выполнить эту операцию на SelectedCells (в любой точке), чтобы получить все (независимо от выбранного в одной строке или многих строк ) данные от одной до многих выбранных ячеек:

MessageBox.Show(

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

               );

Я пробовал это в текстовых (строковых) полях, только если поле DateTime должно вернуть значение initiate ToString(). Также обратите внимание, что SortMemberPath не совпадает с Header, поэтому он должен всегда обеспечивать надлежащее свойство для отражения.

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

Ответ 10

Вы также можете использовать эту функцию.

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

Ответ 11

Я был в такой ситуации.. и нашел это:

int ColumnIndex = DataGrid.CurrentColumn.DisplayIndex;
TextBlock CellContent = DataGrid.SelectedCells[ColumnIndex].Column.GetCellContent(DataGrid.SelectedItem);

И не забудьте обработать шаблоны пользовательских столбцов