In my application I am using DataGridView to display the list. When user select a record in the datagridview, it should display details in the other panel. For selection I was asked to use DataGridView1_SelectionChanged event.
The DataGridView should contain only one column, but the details display may have more information of the selected record( We can get the all the details form the database by querying with the selected Primary key value).
Please tell Is it possible to get datakey(Primary key) of the selected DataGridView record. Does DataGridView will bind based on Primary key ?
Edit
I have implemented DataGridView1.Columns["ID"].Visible = false. It worked well. For selection I added DataGridView1_SelectionChanged event.
But DataGridView1_SelectionChanged event is firing multiple times.
You can use DataGrid.focused property in selectionchanged event before executing the code like this :
private void dg_SelectionChanged(object sender, EventArgs e)
{
if (dg.Focused)
{
// your code
}
}
If the data binding is reset, you can get one SelectionChanged
notifying that the list is temporarily empty followed by another after the data has populated. Worse, the selected item may not even have changed since before the reset. I verified this by checking SelectedCells
on each call.
One solution is to use an invalidation variable, and check in the Application.Idle event. This has the nice effect of grouping changes and avoiding unnecessary updates. Application.Idle runs as soon as the message pump is empty, so the user won't notice a delay. It's even better if you check if a change is even required after the grid has sorted itself out.
You'll need to set up the static form instance property in the constructor.
private bool isViewUpToDate = false;
private void DataGrid_SelectionChanged(object sender, EventArgs e) => isViewUpToDate = false;
public void CheckDataGridSelectionView()
{
if (isViewUpToDate)
return;
// Logic goes here
isViewUpToDate = true;
}
static void Main()
{
Application.Idle += (sender, eventData) => MainForm.Instance?.CheckDataGridSelectionView();
// ...
}
I got the same problems today, after hours of experiment with it, I found a solution or rather a workaround for this problem
this.dgvSearchResult.SelectionChanged -= dgvSearchResult_SelectionChanged;
this.onSearch();
this.dgvSearchResult.SelectionChanged += new EventHandler(dgvSearchResult_SelectionChanged);
Hope it's help
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With