I am trying to Maintain Selected Row of the DataGridView Control after refreshing Data.
This is my code
public partial class frmPlant : Form
{
string gSelectedPlant;
private void frmPlant_Load(object sender, EventArgs e)
{
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = bindingSource1;
FillData();
dataGridView1.DataMember = "Table";
}
private void FillData()
{
ds = _DbConnection.returnDataSet(_SQlQueries.SQL_PlantSelect);
bindingSource1.DataSource = ds.Tables[0];
}
public DataSet returnDataSet(string txtQuery)
{
conn.Open();
sqlCommand = conn.CreateCommand();
DB = new SQLiteDataAdapter(txtQuery, conn);
DS.Reset();
DB.Fill(DS);
conn.Close();
return (DS);
}
private void dataGridView1_Selectionchanged(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
gSelectedPlant = dataGridView1.SelectedRows[0].Cells["PlantId"].Value.ToString();
}
}
private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
int selectedIndex;
if (!string.IsNullOrEmpty(gSelectedPlant) && e.ListChangedType == ListChangedType.Reset)
{
if (ds.Tables.Count > 0)
{
selectedIndex = bindingSource1.Find("PlantId", gSelectedPlant);
if (selectedIndex <= 0)
selectedIndex = 0;
dataGridView1.Rows[selectedIndex].Selected = true;
}
else
{
gSelectedPlant = string.Empty;
}
}
}
}
It is still not able to maintain the rowindex of the selected row. It scrolls to row1.
Here’s the blog I used
http://www.makhaly.net/Blog/9
Suppose, I select a row on Form1(where all this code is) and go on the next form, which shows me detailed info abt the particular Plant . If I come back to this first form again,by pressing the back button, the row is reset to 1. gSelectedPlant takes a value 1
and selectedindex = 0. This makes sense but I am not yet able to figure out how to maintain the value of gSelectedPlant. Yes it takes a null intitally but on databindingcomplete it becomes 1.
Have you tried debugging it? I can’t try it since I don’t know when you call FillData, apart from the loading event of the forms, but I don’t think it is the point where you have the problem. I suspect that the problem is that you always skip the selection part of dataGridView1_DataBindingComplete because gSelectedPlant is always empty or set to the first row.
This usually happens because SelectionChanged is fired many more times than you think, in particular it is called before DataBindingComplete. This means that when you call FillData you should “instruct” your form to ignore the SelectionChanged events until the DataBindingComplete has been executed. This can be done modyfing your code something like this:
You can take a look at the posts of Mark Rideout here:
[http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/01f937af-d0d0-4de5-8919-088e88c5af77/][1]