We use cookies to give you the best experience on our website. If you continue to browse, then you agree to our privacy policy and cookie policy. Image for the cookie policy date

Turning off dynamic sorting GridBoundDataGrid

From my understanding the sorting of the gridbounddatagrid is based of the dataview.sort property.

I'm looking to extend the grid so that when the user changes a value in the sorted column the row doesn't jump and get dynamically sorted.

The requirement then is to only sort when the header of the grid is clicked or double clicked and to show the sort direction arrow (current behaviour).

I've tried override the sortcolumn function performing the following:

public override void SortColumn(int colIndex)
{
base.SortColumn (colIndex);
this.Refresh();
DataView dv = GetDataView();
dv.Sort = "";
}

Unfortunately, this not only removes the current sort but the sort arrow on the header is removed;

I found a sample that works for the GridControl

http://www.syncfusion.com/Support/user/uploads/sortColumnHeader_c211ad31.zip

I essentially need the exact same behaviour as this sample but for the gridbounddatagrid.

I've explored the idea of dynamically adding an additional hidden column and keep a sort index on that column but I'd pefer to avoid this approach if there is a easier solution.

Is there an easy way to turn off the dynamic sort of the grid?

Thanks!

4 Replies

AD Administrator Syncfusion Team November 3, 2006 04:04 AM UTC

Hi Mike,

The attached sample implements the ListWrapper class to avoid the 'jumps' while the user changes the value in a sorted column. It also support the multicolumn sorting in a grid. Please try this and let me know if this helps.

Here is a sample.
http://www.syncfusion.com/Support/user/uploads/WrapperClassSortSample_46fcd2f1.zip

Best Regards,
Haneef


MN Mike Nohr November 6, 2006 11:11 PM UTC

Thanks the sample works great except for one thing:

CurrencyManager cm = (CurrencyManager)this.dbgPOLines.BindingContext[this.dbgPOLines.DataSource];
DataView dv = (DataView)cm.List;

Now the currency manager cast returns the type of the ListWrapper class. Is there a way to have it cast to a dataview as it does by default?


>Hi Mike,

The attached sample implements the ListWrapper class to avoid the 'jumps' while the user changes the value in a sorted column. It also support the multicolumn sorting in a grid. Please try this and let me know if this helps.

Here is a sample.
http://www.syncfusion.com/Support/user/uploads/WrapperClassSortSample_46fcd2f1.zip

Best Regards,
Haneef


AD Administrator Syncfusion Team November 7, 2006 12:19 PM UTC

Hi Mike,

There is no built-in property to get this. You can use the below code snippet to get the dataview from the ListWrapper class.

public DataView GetDataView()
{
PropertyDescriptorCollection tpdc = ((ITypedList)this).GetItemProperties(null);

DataTable dt = new DataTable(((ITypedList)this).GetListName(null));
for(int i =0 ;i< pdc.Count;i++)
dt.Columns.Add(tpdc[i].Name,tpdc[i].PropertyType);
for(int i = 0;i< this.Count;i++)
{
DataRowView row = this[i] as DataRowView;

if( row != null)
dt.Rows.Add(row.Row.ItemArray);
}
return dt.DefaultView;
}

Here is a modified sample.
http://www.syncfusion.com/Support/user/uploads/WrapperClassSortSample_dc4ecd.zip

Best Regards,
Haneef


AD Administrator Syncfusion Team November 9, 2006 08:44 PM UTC

Again I appreciate the quick response and the solution does what we require.

I have however come across one more issue. If you use the following code to bind.

this.grid.DataSource = this.dataset;
this.grid.DataMember = this.datamember; (datatable name)

I've tried to extend the listwrapper class to suppor this using the following:

public ListWrapper(DataSet dataset, string displayMember)
{
ProcessDataTable(new DataView(dataset.Tables[displayMember]));
}

However when the grid tries to use the ITypedList Members specifically:

public PropertyDescriptorCollection GetItemProperties(PropertyDescriptor[] listAccessors)
{
return pdc;
}

an exception is thrown. (ERROR: Cannot create a child list for field "Table")

Thanks again.

>Hi Mike,

There is no built-in property to get this. You can use the below code snippet to get the dataview from the ListWrapper class.

public DataView GetDataView()
{
PropertyDescriptorCollection tpdc = ((ITypedList)this).GetItemProperties(null);

DataTable dt = new DataTable(((ITypedList)this).GetListName(null));
for(int i =0 ;i< pdc.Count;i++)
dt.Columns.Add(tpdc[i].Name,tpdc[i].PropertyType);
for(int i = 0;i< this.Count;i++)
{
DataRowView row = this[i] as DataRowView;

if( row != null)
dt.Rows.Add(row.Row.ItemArray);
}
return dt.DefaultView;
}

Here is a modified sample.
http://www.syncfusion.com/Support/user/uploads/WrapperClassSortSample_dc4ecd.zip

Best Regards,
Haneef

Loader.
Live Chat Icon For mobile
Up arrow icon