Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / Windows Forms / WinForm General / October 2007

Tip: Looking for answers? Try searching our database.

Set currentRow in dgv

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
dbuchanan - 10 Oct 2007 04:23 GMT
Hello,

I have set my dgv to MultiSelect = False  and SelectionMode = FullRowSelect.
How to I programatically make a specific row current?

Additional detail relevent to what I am trying to do...
When the user has a specific row selected and clicks the edit button a
dedicated edit form opens. After completing and saving the edit that form
closes and the dgv on the main form refreshes (fill again). Therefore the
selected row is lost to the user. I want the slection to be preserved for
the user. How do I do this?

My current code...

       private int pkMTaskIdDgvMTasksCurrentRow()
       {
           return (int)dgvMTasks.CurrentRow.Cells[0].Value;
       }

       private void btnAddViewEditTasks_Click(object sender, EventArgs e)
       {
            //Open with the desired value
            AddEditMasterTask f = new
AddEditMasterTask(pkMTaskIdDgvMTasksCurrentRow());
            f.ShowDialog();
            taVwMTask_PhaseDimUnit2.Fill(dataSetHipAdmin2.vwMTask_PhaseDimUnit2);
            // code here to set the current row back to what it was
       }

Thank you,
Doug
Jeffrey Tan[MSFT] - 10 Oct 2007 06:52 GMT
Hi Doug,

Once you know the row index, you may use
DataGridView.Rows[row_index].Selected = true.

To get the previous editing row, you may first save the old selected row
position and re-select in future. The code below demonstrates this logic:

//Save the old position
CurrencyManager cm = this.dataGridView1.BindingContext[this.dt] as
CurrencyManager;
if (cm != null)
{
   int oldPosition = cm.Position;
}

//Restore the old position
CurrencyManager cm = this.dataGridView1.BindingContext[this.dt] as
CurrencyManager;
if (cm != null)
{
    cm.Position = oldPosition ;
}

Note: this code only works for the editing scenario. If your code may also
delete or add the rows, you should use the code above. You should search
the primary key in the DataGridView to find the DataGridViewRow and select
it.

Hope this helps.

Best regards,
Jeffrey Tan
Microsoft Online Community Support
==================================================
Get notification to my posts through email? Please refer to
http://msdn.microsoft.com/subscriptions/managednewsgroups/default.aspx#notif
ications.

Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
where an initial response from the community or a Microsoft Support
Engineer within 1 business day is acceptable. Please note that each follow
up response may take approximately 2 business days as the support
professional working with you may need further investigation to reach the
most efficient resolution. The offering is not appropriate for situations
that require urgent, real-time or phone-based interactions or complex
project analysis and dump analysis issues. Issues of this nature are best
handled working with a dedicated Microsoft Support Engineer by contacting
Microsoft Customer Support Services (CSS) at
http://msdn.microsoft.com/subscriptions/support/default.aspx.
==================================================
This posting is provided "AS IS" with no warranties, and confers no rights.
dbuchanan - 11 Oct 2007 04:46 GMT
Hi Jeffrey

The following selects the row but does not make it current. This will not
work for me.
=============
      private void btnAddViewEditTasks_Click(object sender, EventArgs e)
       {
            //Save the old position
            int rowIndex = this.dgvMTasks.CurrentRow.Index;
            AddEditMasterTask f = new
AddEditMasterTask(pkMTaskIdDgvMTasksCurrentRow());
            f.ShowDialog();
            taVwMTask_PhaseDimUnit2.Fill(dataSetHipAdmin2.vwMTask_PhaseDimUnit2);
            //Restore the old position
            this.dgvMTasks.Rows[rowIndex].Selected = true;
        }
=============

I need to set the Current row not the slected row. There is a difference I'm
sure you know.

http://groups.google.com/group/microsoft.public.dotnet.framework.windowsforms.co
ntrols/browse_thread/thread/5b1cb903518fafcc/b3922a8a5db13e70?lnk=gst&q=set+curr
ent+row&rnum=6#b3922a8a5db13e70


but I can't find how to set it. Can you tell me how that is done?

Maybe I didn't understand but this does not work. It does not resore the
current postion of the selected/current row.
=============
       private void btnAddViewEditTasks_Click(object sender, EventArgs e)
       {
            //Save the old position
            CurrencyManager cm =
this.dgvMTasks.BindingContext[dataSetHipAdmin2] as CurrencyManager;
            int oldPosition = cm.Position;
            AddEditMasterTask f = new
AddEditMasterTask(pkMTaskIdDgvMTasksCurrentRow());
            f.ShowDialog();
            taVwMTask_PhaseDimUnit2.Fill(dataSetHipAdmin2.vwMTask_PhaseDimUnit2);
            //Restore the old position
            cm.Position = oldPosition;
        }
=============
Would you help.

It is like the authors of help could not use any imagination that someone
would ever what to do that --- or I don't know how to find such things form
help.

Thank you,
Doug
Jeffrey Tan[MSFT] - 11 Oct 2007 07:23 GMT
Hi Doug,

Thanks for your feedback.

In MultiSelect = False  and SelectionMode = FullRowSelect, I think the
current row should be the same as selected row. Anyway, if you wanted to
set the current row, you may set DataGridView.CurrentCell to one cell of
that row. This will set the current row either.

Regarding setting the CurrencyManager.Position not working, I have written
a test project with code below. Button1 saves the old position and the
Button2 will restore the old postion, it works well on my side:

DataTable dt;
private void Form1_Load(object sender, EventArgs e)
{
    dt = new DataTable();
   dt.Columns.Add(new DataColumn("column1", typeof(int)));
   dt.Columns.Add(new DataColumn("column2", typeof(string)));

   for (int i = 0; i < 5; i++)
   {
       DataRow dr = dt.NewRow();
       dr["column1"] = i;
       dr["column2"] = "item" + i.ToString();
       dt.Rows.Add(dr);
   }
   this.dataGridView1.DataSource = dt;
}

int oldPosition;
private void button1_Click(object sender, EventArgs e)
{
   CurrencyManager cm = this.dataGridView1.BindingContext[this.dt] as
CurrencyManager;
   if (cm != null)
   {
       oldPosition = cm.Position;
   }
}

private void button2_Click(object sender, EventArgs e)
{
   CurrencyManager cm = this.dataGridView1.BindingContext[this.dt] as
CurrencyManager;
   if (cm != null)
   {
       cm.Position = oldPosition;
   }
}

If you still fail to get it working, I can provide a sample project to you.
Thanks.

Best regards,
Jeffrey Tan
Microsoft Online Community Support
==================================================
Get notification to my posts through email? Please refer to
http://msdn.microsoft.com/subscriptions/managednewsgroups/default.aspx#notif
ications.

Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
where an initial response from the community or a Microsoft Support
Engineer within 1 business day is acceptable. Please note that each follow
up response may take approximately 2 business days as the support
professional working with you may need further investigation to reach the
most efficient resolution. The offering is not appropriate for situations
that require urgent, real-time or phone-based interactions or complex
project analysis and dump analysis issues. Issues of this nature are best
handled working with a dedicated Microsoft Support Engineer by contacting
Microsoft Customer Support Services (CSS) at
http://msdn.microsoft.com/subscriptions/support/default.aspx.
==================================================
This posting is provided "AS IS" with no warranties, and confers no rights.
dbuchanan - 12 Oct 2007 03:44 GMT
Jeffery,

> In MultiSelect = False  and SelectionMode = FullRowSelect, I think the
> current row should be the same as selected row.

It IS set MultiSelect = False  and SelectionMode = FullRowSelect
but it does not work. Here is my code again.

=============
       private void btnAddViewEditTasks_Click(object sender, EventArgs e)
       {
            //Save the old position
            CurrencyManager cm =
this.dgvMTasks.BindingContext[dataSetHipAdmin2] as CurrencyManager;
            int oldPosition = cm.Position;
            AddEditMasterTask f = new
AddEditMasterTask(pkMTaskIdDgvMTasksCurrentRow());
            f.ShowDialog();
            taVwMTask_PhaseDimUnit2.Fill(dataSetHipAdmin2.vwMTask_PhaseDimUnit2);
            //Restore the old position
            cm.Position = oldPosition;
        }
=============

Thank you for your sample code. There are differences in my code and yours,
but not differences that I think should cause it not to work.
Your buttons recreate the currency manager, mine reuses the curencymanager
variable because I go to a dialog, but that shouldn't make the variable not
work. It does not throw an error.

...
I don't think it is possible to do what I want to do!

What I am trying to do:
When the user has a specific row selected in the dgv and clicks the edit
button a
dedicated edit form opens. After completing and saving the edit that form
closes and the dgv on the main form refreshes (fill again). Therefore the
selected row is lost to the user. I want the slection to be preserved for
the user.

Her is why I don't think this is possible
. If the user adds a row - the code will not know which row to make current
because the ID is assigned by the database
. If the user deletes a row - the code will not know where to go. I would
probably want to go to a the previous record.
. If the user edits a row it cannot reliably return to that row based on
currentCell because the row must be unique to be reliable and the only
unique column is the hidden primary key in my form ( I would have to show
it)

It looks like I don't have many choices but show the primay key, yet that
only fixes one of the three in my list.

Can you think on anything?

Is there any way to refresh the edited data without clearing and refilling
the datagrid?

Thank you,
Doug
Jeffrey Tan[MSFT] - 12 Oct 2007 09:55 GMT
Hi Doug,

Thanks for your detailed feedback.

> Your buttons recreate the currency manager
Not exactly, my code did not create a new CurrencyManager. The
CurrencyManager object is always maintained in the databinding manager, in
my second button, I just retrieve the original CurrencyManager through
reference. I did not create a new one. So my code logic should be the same
as yours.

Yes, I agree that we may not go with the solution of setting
CurrencyManager.Position, since you may add or delete rows.

I think your requirement is possible, here is the logic:
Before you edit(add) the rows, you may first preserve the selected
row(current row) primary cell value. After the editing(adding), you may
search in the DataGridView for the original saved primary cell value. Once
you find that cell, you may set it as the DataGridView.CurrentCell.

Regarding the deleting scenario, you have to save the previous row primary
cell value.

Does this logic meet your need? If not, please feel free to explain to me.
Thanks.

Best regards,
Jeffrey Tan
Microsoft Online Community Support
==================================================
Get notification to my posts through email? Please refer to
http://msdn.microsoft.com/subscriptions/managednewsgroups/default.aspx#notif
ications.

Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
where an initial response from the community or a Microsoft Support
Engineer within 1 business day is acceptable. Please note that each follow
up response may take approximately 2 business days as the support
professional working with you may need further investigation to reach the
most efficient resolution. The offering is not appropriate for situations
that require urgent, real-time or phone-based interactions or complex
project analysis and dump analysis issues. Issues of this nature are best
handled working with a dedicated Microsoft Support Engineer by contacting
Microsoft Customer Support Services (CSS) at
http://msdn.microsoft.com/subscriptions/support/default.aspx.
==================================================
This posting is provided "AS IS" with no warranties, and confers no rights.
dbuchanan - 23 Oct 2007 12:20 GMT
Hello Jeffry,

> Does this logic meet your need?
Yes. I would  have to show the primary key id, but I guess that is okay.

> After the editing(adding), you may search in the DataGridView
> for the original saved primary cell value. Once you find that cell,
> you may set it as the DataGridView.CurrentCell.

I think I know how to do this... (from viewing a post by Linda Lu)

// find the row
int gridrowindex = this.bindingSource1.Find("MyPrimaryKeyColumn", "11");

// set the current cell
this.dataGridView1.CurrentCell = DataGridViewCell(gridrowIndex,1)

Have you done this before? Do you have any suggestions?

Thanks,
Doug
dbuchanan - 24 Oct 2007 04:05 GMT
Thanks Jeffery,

With your help and after a little work I figured out how to get and set the
CurrentCell of a data bound DataGridView.

My first column (Cells[0]) is the primary key of the bound data. I put two
buttons on my form to Save and Restore the column position in this test.

=== When the DataGridView is Bound ===

       // variable to save the bound value of the primary key
       string pk;

       private void btnSaveCurrentRow_Click(object sender, EventArgs e)
       {
           // Save the primary key value
           pk = this.dataGridView1.CurrentRow.Cells[0].Value.ToString();
           //MessageBox.Show(pk);
       }

       private void btnRestoreCurrentRow_Click(object sender, EventArgs e)
       {
           // Find the primary key value in the bindingSource
           int gridrowindex = this.bindingSource1.Find("pkPhaseID", pk);
           // Restore the cursor position
           this.dataGridView1.CurrentCell =
this.dataGridView1.Rows[gridrowindex].Cells[0];
       }

Thanks,
Doug
Jeffrey Tan[MSFT] - 25 Oct 2007 04:08 GMT
Hi Doug ,

Sorry for the late reponse, I am taking sick leave at home yesterday.

Thank you for updating your status. Yes, this logic should work.
Additionally, there is no need for you to show the primary key column in
the DataGridView. When you save the editing row primary key value, you may
use CurrencyManager.Current to get the DataRowView of that row. Then you
may get the primary key value in the DataRowView.

If you have problem of getting the above logic to work, please feel free to
tell me, thanks.

Best regards,
Jeffrey Tan
Microsoft Online Community Support
==================================================
Get notification to my posts through email? Please refer to
http://msdn.microsoft.com/subscriptions/managednewsgroups/default.aspx#notif
ications.

Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
where an initial response from the community or a Microsoft Support
Engineer within 1 business day is acceptable. Please note that each follow
up response may take approximately 2 business days as the support
professional working with you may need further investigation to reach the
most efficient resolution. The offering is not appropriate for situations
that require urgent, real-time or phone-based interactions or complex
project analysis and dump analysis issues. Issues of this nature are best
handled working with a dedicated Microsoft Support Engineer by contacting
Microsoft Customer Support Services (CSS) at
http://msdn.microsoft.com/subscriptions/support/default.aspx.
==================================================
This posting is provided "AS IS" with no warranties, and confers no rights.
dbuchanan - 26 Oct 2007 02:24 GMT
Jeffery,

> Additionally, there is no need for you to show the primary key column in
> the DataGridView. When you save the editing row primary key value, you may
> use CurrencyManager.Current to get the DataRowView of that row. Then you
> may get the primary key value in the DataRowView.

Thank you for that tip. I didn' t think it was possible.

With a little thought and work I arrived at the code below.

Because 'CurrentRow' cannot set its value when hidden I didn't think it
could get its value when it was hidden either, but it can as the working
code below demonstrates. Pleasant surprise!

       // variable to save the bound value of the primary key
       string pk;

       private void btnSaveCurrentRow_Click(object sender, EventArgs e)
       {
           // Save the primary key value
           pk = this.dataGridView1.CurrentRow.Cells[0].Value.ToString();
           //MessageBox.Show(pk);
       }

       private void btnRestoreCurrentRow_Click(object sender, EventArgs e)
       {
           // Find the primary key value in the bindingSource
           int gridrowindex = this.bindingSource1.Find("pkPhaseID", pk);
           // Restore the cursor position
           this.dataGridView1.CurrentCell =
this.dataGridView1.Rows[gridrowindex].Cells[1];
       }

Thank you,
Doug

Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.