Re: DataGrid and DataView question by TimJohnson
TimJohnson
Fri Jul 22 18:26:08 CDT 2005
Two followup questions. Here's the first:
I can see the underlying dataview being sorted when I use your code, so when
I click on column "XYZ" I see it sorted ascending when I stop in the
debugger. When I let it go however it ends up sorted DEscending. It's as
though I've sorted the underlying source, which the grid sticks with, then
afterwards the grid control does its own sort. And since by the time he sees
it he thinks the click on column XYZ is a 2nd sort. How can I override the
datagrid's "extra" sort, if in fact that's what's happeing?
Tim
"Darren Shaffer" wrote:
> Tim,
>
> There is no bug, you just need to understand the DataRowView and
> CurrencyManager
> behavior. Rather than write an essay here, instead I'll just give you the
> code to make
> sure your selection is correct after sorting. This code is for a DataGrid
> that contains
> a list of car dealerships.
>
> private void dgDealership_MouseUp(object sender,
> System.Windows.Forms.MouseEventArgs e)
> {
> if ( dgDealership.VisibleRowCount == 0 )
> return;
>
> SortDataGrid(sender, e);
>
> dgDealership.Select(dgDealership.CurrentRowIndex);
> CurrencyManager cm =
> (CurrencyManager)BindingContext[dgDealership.DataSource];
>
> DataRowView drv = (DataRowView)cm.Current;
>
> lblDealerName.Text = drv.Row[0].ToString();
> lblDealerAddress.Text = drv.Row[1].ToString();
>
> _dealerSelected = drv.Row[5].ToString();
>
> }
>
> public static void SortDataGrid(object sender,
> System.Windows.Forms.MouseEventArgs e)
> {
> DataGrid.HitTestInfo hitTest;
> DataTable dataTable;
> DataView dataView;
> string columnName;
> DataGrid dataGrid;
>
> if (e.Button == MouseButtons.Left)
> {
> dataGrid = (DataGrid)sender;
> hitTest = dataGrid.HitTest(e.X, e.Y);
> if (hitTest.Type == DataGrid.HitTestType.ColumnHeader)
> {
> dataTable = (DataTable)dataGrid.DataSource;
> dataView = dataTable.DefaultView;
>
> if(dataGrid.TableStyles.Count != 0)
> columnName =
> dataGrid.TableStyles[0].GridColumnStyles[hitTest.Column].MappingName;
> else
> columnName = dataTable.Columns[hitTest.Column].ColumnName;
>
> if (dataView.Sort == columnName)
> dataView.Sort = columnName + " DESC";
> else
> dataView.Sort = columnName;
> }
> }
> }
>
> --
> Darren Shaffer
> ..NET Compact Framework MVP
> Principal Architect
> Connected Innovation
> www.connectedinnovation.com
>
>
>
> "Tim Johnson" <TimJohnson@discussions.microsoft.com> wrote in message
> news:E6741A3F-278C-4377-8DF5-B3178FC680B8@microsoft.com...
> >I inherited some code that binds a dataset/datatable to a datagrid. When
> >the
> > user highlights some rows the code loops thru a DataView of the grid to
> > act
> > on those rows. This works fine, unless you first click a column to sort
> > by
> > that column. Then the datagrid rows are not in the same sequence as the
> > datasource table. I'm thinking this is a definite bug in this code, but
> > I'm
> > wondering what the point of doing things this way might have been. I mean
> > why bother with CurrencyManager and DataView if you can just access the
> > elements via datagrid1[row, col]?
> >
> > Here's an example of the loop which seems overkill to me (besides not
> > working if you sort first!):
> >
> > CurrencyManager mgr = (CurrencyManager)
> > dataGrid1.BindingContext[dataGrid1.DataSource, dataGrid1.DataMember];
> >
> > DataView dv = (DataView)mgr.List;
> >
> > for (int i = 0; i < dv.Count; ++i)
> > {
> > if (dataGrid1.IsSelected(i))
> > {
> > DataRow row = dv.Table.Rows[i];
> >
> > <get a field from row here...>
> > }
> > }
> >
> > I mean, if the datagrid got sorted, the underlying datatable or dataview
> > isn't also sorted is it? So highlighted row 1 in a sorted datagrid is NOT
> > row 1 in the presorted datatable or dataview. Am I missing something in
> > at
> > least the intention here?
>
>
>