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" <(E-Mail Removed)> wrote in message
news:E6741A3F-278C-4377-8DF5-(E-Mail Removed)...
>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?