Ссылка на текст из ячейки WPF DataGrid

Мне нужно получить дату и время из таблицы SQL, но у меня есть две проблемы:

  1. Мне нужно обратиться к строке из выбранной ячейки DataGrid. Я пробовал "bksDataGrid.CurrentCell.Item", но это не работает.
  2. На самом деле это не проблема, но cmd вернет дату и время SQL как объект. Можно ли преобразовать его в .NET DateTime?

        object obj = new object();
        using (SqlConnection conn=new SqlConnection (SQLLogic.ConnString1))
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand(String.Format("SELECT ReturnDate FROM Borrows WHERE Name='{0}'",bksDataGrid.CurrentCell.Item, conn),conn);
            obj = cmd.ExecuteScalar();
            conn.Close();
        }
        obj = Convert.ToDateTime(obj);
    

Извините, за возможные грамматические ошибки.


person pkain    schedule 06.01.2010    source источник


Ответы (1)


Для № 1 вы можете сделать следующее:

foreach (DataGridCellInfo cellInfo in dataGrid.SelectedCells)
{
    DataGridCell gridCell = TryToFindGridCell(dataGrid, cellInfo);
    if (gridCell != null && gridCell.Content is TextBlock)
        Console.WriteLine(((TextBlock)gridCell.Content).Text);
}

ниже приведена реализация процедуры TryToFindGridCell:

static DataGridCell TryToFindGridCell(DataGrid grid, DataGridCellInfo cellInfo)
{
    DataGridCell result = null;
    DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromItem(cellInfo.Item);
    if (row != null)
    {
        int columnIndex = grid.Columns.IndexOf(cellInfo.Column);
        if (columnIndex > -1)
        {
            DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);
            result = presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex) as DataGridCell;
        }
    }
    return result;
}

static T GetVisualChild<T>(Visual parent) where T : Visual
{
    T child = default(T);
    int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
    for (int i = 0; i < numVisuals; i++)
    {
        Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
        child = v as T;
        if (child == null) child = GetVisualChild<T>(v);
        if (child != null) break;
    }
    return child;
}

#2:

a.line "объект obj = новый объект();" не нужен;

b.вы можете привести результат cmd.ExecuteScalar к DateTime. Вы также хотели бы проверить, что это не null или DBNull перед кастингом; в противном случае вы можете получить исключение «Указанный состав недействителен».

надеюсь, это поможет, с уважением

person serge_gubenko    schedule 07.01.2010