Link to home
Start Free TrialLog in
Avatar of pkoivula
pkoivulaFlag for United States of America

asked on

how to stop selected columns refresh in wpf datagrid

I am using datatable to bind to wpf datagrid and refreshing items of datagrid by using background worker , in my datagrid i am using a checkbox for selecting items. Because of the background worker , when i do checkbox checked, it is unchecking as background worker is running, if i comment the datagrid binding logic in background worker , checkbox is getting checked. Can any one help how to do checkbox get selected even when datagrid items are getting refreshed. i am creating checkbox using "DataGridCheckBoxColumn ". Thanks for the help in advance
Avatar of dj_alik
dj_alik

You are working with datatable  try  to  bind the 'checked' flag field to some column(Boolean) in datatable and when your refresh   the datasource in background worker  you can do merging between previous datatable and new one (datatable.Merge())
that will save state of your checked flags.
in addition is recommended to have primary keys in datatable.
better: please do not  add the check field column to new datatable... on refresh/merge.
Avatar of pkoivula

ASKER

We are following the same pattern datatable.Merge() , but it didn't helped me in getting the problem solved. I am filling datatable from dataset , and  using merge on it. Now i am binding the datatable to datagrid.
Please post the code of your binding\refresh section
in my xaml i wrote :
 
<DataGrid Name="dtGrdTemp" HorizontalScrollBarVisibility="Visible"  RowDetailsVisibilityMode="Collapsed" AutoGenerateColumns="False"  ItemsSource="{Binding}" HorizontalAlignment="Stretch" Margin="-2,0,-2,0" Loaded="dtGrdTemplates_Loaded" VerticalAlignment="Stretch" Grid.ColumnSpan="2" Background="White"  CanUserAddRows="False" GridLinesVisibility="All" HorizontalGridLinesBrush="Silver" Width="Auto" VerticalContentAlignment="Stretch"  RowHeight="20" VerticalGridLinesBrush="Silver" SelectionChanged="dtGrdTemplates_SelectionChanged" CanUserResizeColumns="False" IsEnabledChanged="dtGrdTemplates_IsEnabledChanged" AreRowDetailsFrozen="False" SelectionMode="Single">
 
 <DataGrid.Columns>
<DataGridCheckBoxColumn IsReadOnly="False" Selector.IsSelected="False">
</DataGridCheckBoxColumn>  
<DataGridTextColumn Binding="{Binding FileName}" Header="File Name" Width="*"/>
 
.
.
.
 
In code behind window i wrote
 
for binding data i wrote a method with this functionality
 
   getDataForConsole.Tables[tableName].Merge(objPlanningConsoleUIController.GetCachedDataSet()); //filling data from dataset
                if (getDataForConsole.Tables[tableName].Rows.Count > 0)
                {
                                      if (_resetBinding ||
                        dtGrdTemp.ItemsSource == null ||
                        dtGrdTemp.Items.Count == 0)
                    {
                        dtGrdTemp.ItemsSource = getDataForConsole.Tables[tableName].DefaultView;
                        _resetBinding = false;
                    }
                }
 
 
I called this functionality method in background worker in RunWorkerCompleted event.
please tell how to stop refreshing particular datagrid row columns.
ok as I said you need  may be to merge with table without  field flag...
may be it's complex to describe.

First Load of Datatable with primary keys and 'Selected Flag Field'\Column

secondary load and next: Merges  with Table without 'Selected Flag Field'\Column' in Schema.

you can add dynamically the check column in first load: DataTable.Columns.Add("Selected",typeof(Boolean)) and please bind it to checkbox column.
ASKER CERTIFIED SOLUTION
Avatar of pkoivula
pkoivula
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Fixed it by myself.