none
Редактирование DataGrid в WPF RRS feed

  • Общие обсуждения

  • Доброго времени суток,

    окно приложения WPF, на нем DataGrid, подключенный к DataTable, заданный следующей разметкой:

            <DataGrid Grid.Row="1" Name="SprGrid" AutoGenerateColumns="False" 
                            Background="{x:Null}" HorizontalAlignment="Stretch"
                            HorizontalGridLinesBrush="#FFD9DADA" VerticalGridLinesBrush="#FFD9DADA" 
                            RowHeaderWidth="25" CanUserDeleteRows="True" CanUserAddRows="True" 
                            RowDetailsVisibilityMode="VisibleWhenSelected" SelectionMode="Extended"
                            IsTextSearchEnabled="True" IsTextSearchCaseSensitive="True" SelectionUnit="FullRow">

    В DataGrid, в самом низу таблицы есть пустая строчка, куда пользователь может занести новую запись. Эта строка есть по умолчанию, если свойство CanUserAddRows="True".

    Таблица содержит часть элементов справочника, в котором есть код и наименование объекта. Мне необходимо при изменении значения первого поля таблицы изменять значение второго поля и наоборот. Т.е. если пользователь ввел код объекта в первом поле, то во втором поле должно автоматически отобразиться его наименование. Если если во втором поле из списка пользователь выбирает наименование, то в первом должен отобразиться его код.

    Задача кажется тривиальной. На событии DataTable RowChanged я вычисляю значение одного из полей на основе содержимого другого. Все хорошо работает, если строка уже внесена в таблицу DataTable. Т.е. если строка уже является частью коллекции Rows таблицы. Но нижняя, новая строчка, добавляемая самим DataGrid при CanUserAddRows="True", не является частью коллекции Rows. Ее свойство RowState = DataRowState.Detached. Когда я присваиваю в коде значение ее полю:

    protected void CbVesSelectionChanged(object sender, SelectionChangedEventArgs e) { if (!(MainGrid.SelectedItem is DataRowView)) return; var dataRow = (DataRowView) MainGrid.SelectedItem; dataRow["id_" + SprName] = ((SprType)((ComboBox)sender).SelectedValue).Id;

    }


    Это значение не отображается в DataGrid пока не будет нажата клавиша Enter или не будет произведен переход на другую строчку. Я пытался самостоятельно добавлять эту новую строчку в коллекцию Rows DataTable:

            protected void CbVesSelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                if (!(MainGrid.SelectedItem is DataRowView))
                    return;
                var dataRow = (DataRowView) MainGrid.SelectedItem;
                dataRow.Row["id_" + SprName] = ((SprType)((ComboBox)sender).SelectedValue).Id;
    
                if (dataRow.Row.RowState == DataRowState.Detached)
                    _mainTable.Rows.Add(dataRow.Row);
            }

    В этом случае значение поля 

    dataRow.Row["id_" + SprName]

    отображается в  DataGrid, но при этом исчезает пустая нижняя строчка DataGrid, которая используется для добавления строк. 

    Есть ли возможность автоматически рассчитать и отобразить значение одного из полей таблицы при изменении другого в новой пустой строчке DataGrid?

    13 августа 2012 г. 2:50

Все ответы

  • Уважаемый пользователь!

    В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме


    Для связи [mail]

    22 августа 2012 г. 13:32