Запуск другого события из одного события - PullRequest
0 голосов
/ 24 октября 2010

я постараюсь прояснить .. здесь я работаю над сеткой данных.в сетке данных один столбец является редактируемым, так как я передаю ему DataGridTextColumn и удерживаю данные, когда пользователи вводят данные в него, и записывает обратно в базу данных.я сохраняю в базу данных, используя событие datagrid_celleditending, также я использую datagridcelleditendingeventargs, чтобы сделать это.Это сделано и работает нормально.я добавил новые функции, так что вместо ввода данных в сетку данных пользователи будут вводить в одно текстовое поле, которое будет отображаться поверх сетки данных, и при вводе данных в ячейку я синхронизирую его с ячейкой сетки данных и вижу в ней данные(точно так же, как в Excel есть одна большая полоса сверху, и вы можете записать данные туда, а также увидеть в таблице данных).Я делаю это с помощью события textbox_keyup.Теперь я хотел запустить событие args события datagrid_celleditending.я попытался использовать реализацию перенаправленного события, но она не работает.

надеюсь, я не путаю, пожалуйста, помогите ..

Вот кусок кода ..

private void dataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
    {
        DataRowView rowView = e.Row.Item as DataRowView;
        rowBeingEdited = rowView;
        //Here my logic to write to database will come
        .........
        .........      
   }

// Вышеупомянутое событие работает нормально, когда я изменяю в сетке данных, теперь я хотел запустить это, когда я вводил данные в текстовое поле, которое не является частью сетки данных

   private void tb_Comments_KeyUp(object sender, KeyEventArgs e)
    {
        if (rowBeingEdited != null)
        {
            rowBeingEdited.Row["Comments"] = tb_Comments.Text;
           //here i wanted to go to the above event and fire it..how can i do it??
        }

     }

1 Ответ

0 голосов
/ 24 октября 2010

Каков ваш SelectionUnit для DataGrid?Это работает для SelectionUnit = "CellOrRowHeader", в противном случае некоторые вещи должны быть немного изменены в конце.В любом случае, следующий код переводит ячейку в режим редактирования, а затем фиксирует ее, которая вызывает событие CellEditEnding.

public void EnterCellEditEndingForCell(DataGridColumn column, DataRowView dataRowView)
{
    int selectedRowIndex = -1;
    // c_dataGrid.Items.IndexOf(dataRowView)
    // sometimes break and return -1.
    for (int i = 0; i < c_dataGrid.Items.Count; i++)
    {
        DataRowView rowView = c_dataGrid.Items[i] as DataRowView;
        if (rowView == dataRowView)
        {
            selectedRowIndex = i;
            break;
        }
    }
    int selectedColumnIndex = c_dataGrid.Columns.IndexOf(column);
    if (selectedRowIndex >= 0 && selectedColumnIndex >= 0)
    {
        DataGridCell dataGridCell = DataGridHelper.GetCell(c_dataGrid, selectedRowIndex, selectedColumnIndex);
        if (dataGridCell == null)
        {
            c_dataGrid.ScrollIntoView(dataRowView);
            dataGridCell = DataGridHelper.GetCell(c_dataGrid, selectedRowIndex, selectedColumnIndex);
        }
        dataGridCell.BringIntoView();
        dataGridCell.Focus();
        c_dataGrid.SelectedCells.Clear();
        DataGridCellInfo info = new DataGridCellInfo(dataGridCell);
        c_dataGrid.SelectedCells.Add(info);
        c_dataGrid.BeginEdit();
        c_dataGrid.CommitEdit(DataGridEditingUnit.Cell, true);
    }
}

DataGridHelper.cs, если у вас нет реализации этого

static class DataGridHelper
{
    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;
    }

    static public DataGridCell GetCell(DataGrid dg, int row, int column)
    {
        DataGridRow rowContainer = GetRow(dg, row);

        if (rowContainer != null)
        {
            DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

            // try to get the cell but it may possibly be virtualized
            DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
            if (cell == null)
            {
                // now try to bring into view and retreive the cell
                dg.ScrollIntoView(rowContainer, dg.Columns[column]);
                cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
            }
            return cell;
        }
        return null;
    }


    static public DataGridRow GetRow(DataGrid dg, int index)
    {
        DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
        if (row == null)
        {
            // may be virtualized, bring into view and try again
            dg.ScrollIntoView(dg.Items[index]);
            row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
        }
        return row;
    }
}

ОБНОВЛЕНИЕ Если у вас выбрана только одна ячейка (что звучит как случай), то вы можете сделать это.

private void tb_Comments_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (rowBeingEdited != null) 
    { 
        rowBeingEdited.Row["Comments"] = tb_Comments.Text; 
        DataGridColumn columnBeingEdited= GetActiveDataGridColumn();
        EnterCellEditEndingForCell(columnBeingEdited, rowBeingEdited);
    } 
 } 

private DataGridColumn GetActiveDataGridColumn()
{
    if (c_dataGrid.SelectedCells.Count != 1)
    {
        return null;
    }
    return c_dataGrid.SelectedCells[0].Column;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...