-
Aug 26th, 2014, 01:29 PM
#1
Thread Starter
Hyperactive Member
Problems adding rows to a DataGrid
To start with, I am using VS2012 and .NET 4.5.
I am binding a DataGrid to an ObservableCollection<DataItem> and want to allow in-grid editing. I have CanUserAddRows and CanUserDeleteRows set to true. When I bind the DataGrid to the collection, the data displays perfectly (only one column of the class visible, the rest can be filled in programmatically), along with a {NewItemPlaceholder} row. I can edit existing rows and it works fine, but when I attempt to add a new row by moving to the placeholder, entering a value, and then hitting enter, nothing happens. That is, the new value is displayed, but the AddingNewItem event never fires, the new row isn't added to the underlying collection, and no new {NewItemPlaceholder} row is added to the DataGrid.
I'm probably doing (or, more accurately, NOT doing) something stupid, but I haven't done a lot of work with DataGrids, so I'm looking for a hand.
Do I have to manually implement the add functionality? If so, is there a built-in event to tell me when to do that, or do I have to do something kludgy like trap the enter key and use that to fire the manual add functionality? Or am I just missing something fairly simple?
-
Aug 27th, 2014, 04:07 AM
#2
Re: Problems adding rows to a DataGrid
Given that your DataItem class implements INotifyPropertyChanged, you need to add Mode and UpdateSourceTrigger
in your data grid columns.
Code:
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}"
Margin="12,12,12,41" Name="dataGrid1"
RowEditEnding="dataGrid1_RowEditEnding">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding UserName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="User name" Width="230">
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="First Name" Width="250">
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
where UserName and FirstName are properties defined in DataItem class.
KGC
-
Aug 27th, 2014, 08:10 AM
#3
Thread Starter
Hyperactive Member
Re: Problems adding rows to a DataGrid
Already got that... as I said, it works fine updating existing data, which means the columns are bound properly. It's the adding of new rows that doesn't work as it should...
Here's the XAML for the DataGrid:
Code:
<DataGrid x:Name="grdAddls" Grid.Row="3" Grid.Column="4" Margin="5,2,5,2" AutoGenerateColumns="False"
IsEnabled="True" IsReadOnly="False" RowHeaderWidth="30" AlternatingRowBackground="LightGray" GridLinesVisibility="All" BorderThickness="2" MouseRightButtonUp="grdAddls_MouseRightButtonUp" AddingNewItem="grdAddls_AddingNewItem" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserSortColumns="False">
<DataGrid.RowHeaderStyle>
<Style TargetType="{x:Type DataGridRowHeader}">
<Setter Property="Content" Value="{Binding Converter={StaticResource IndexConverter}, ConverterParameter=grdAddls}" /> <!-- Shows a row # -->
</Style>
</DataGrid.RowHeaderStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Proc ID" Binding="{Binding Path=ProcID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Visibility="Hidden"></DataGridTextColumn>
<DataGridTextColumn Header="ProcAddlID" Binding="{Binding Path=ProcAddlID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Visibility="Hidden"></DataGridTextColumn>
<DataGridTemplateColumn Header="Code">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox CharacterCasing="Upper" Text="{Binding Path=ProcCodeDisplay, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
It works fine when updating existing rows... the values are placed in the underlying observable collection when they are modified. It's adding a new row where it messes up... entering a code and hitting return does nothing, not creating the object in the underlying collection, not creating a new "add row" and moving the cursor to it, nothing.
-
Aug 27th, 2014, 11:06 AM
#4
Re: Problems adding rows to a DataGrid
Try adding a RowEditEnding with Commit checking to trace any changes to your observable collection object. Given that you are entering new item to a new item placeholder.
Code:
private void grdAddls_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{
if (e.EditAction == DataGridEditAction.Commit)
{
//add logic to check your observable collection
//......
}
}
-
Aug 27th, 2014, 12:23 PM
#5
Thread Starter
Hyperactive Member
Re: Problems adding rows to a DataGrid
I have verified that the underlying collection isn't being modified two ways. First, by placing a breakpoint in the AddingNewItem handler, which is never fired. Second, by putting a button on the form to display the underlying collection in a messagebox. The collection isn't being updated at any point with the data I entered into the NewItemPlacholder row, and I've tried moving focus to another control, moving back to other cells in the same DataGrid, and every other GUI action I could think of. At no point was the underlying collection updated.
However, I added the RowEditEnding handler and tried again, but it never fired no matter how much I moved through the DataGrid rows or clicked on other edit fields on the form. And the underlying collection never changed.
-
Aug 27th, 2014, 09:11 PM
#6
Re: Problems adding rows to a DataGrid
In my case, I created a property AllDataItems of type ObservableCollection<DataItems>, then in the code below,
I added a collection changed event to monitor any changes to collection like Add/Delete and etc..
Constructor
Code:
dataGrid1.ItemsSource = AllDataItems;
AllDataItems.CollectionChanged += AllDataItems_CollectionChanged;
Code:
// monitor any collection changes
private void AllDataItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
//logic to monitor AllDataItems
}
Did you implement INotifyPropertyChanged in DataItem class?
KGC
Tags for this Thread
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|