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 / January 2007

Tip: Looking for answers? Try searching our database.

How do convince a DataGridView it's been edited?

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
DanThMan - 24 Jan 2007 21:12 GMT
The situation:

* I have a ButtonColumn in a DataGridView.
* When the user preses one of the buttons, a dialog appears.
* Based on what the user selects in the dialog, data is entered
programmatically into the the underlying cell (i.e., I'm setting Value
property of the cell based on user input, but the user is not directly
entering any data).

The problem:

The DataGridView doesn't seem believe the user has edited the row, so
if the user clicks or tabs somewhere else (which causes the
DataGridView to lose focus), all the changes to the row get
cleared/canceled.

Other information:

Looking at the RowHeaderCell for the row as it's being edited, it
changes from a large asterisk [*] to a right arrow + asterisk [>*].
This is different than if the user directly edits a cell by typing (in
that case, you'd get a pencil icon while the cell is in edit mode
followed by a large right arrow after the change is committed).

My question:

So, how do I programmatically tell the DataGridView that the user
really has touched/edited this row and that the data should stick even
if the DataGridView loses focus.

Thanks!

-Dan
Ciaran O''Donnell - 25 Jan 2007 09:26 GMT
If the grid is bound, edit the underlying data source. I dont ever add rows
and columns to a grid with out binding it. I make a DataTable first and let
that be the container for the data. Then I can bind the grid to it and update
the DataTable when needs be.

Signature

Ciaran O''Donnell
http://wannabedeveloper.spaces.live.com

> The situation:
>
[quoted text clipped - 29 lines]
>
> -Dan
ClayB - 25 Jan 2007 10:41 GMT
One other comment in addition to what Ciaran suggested is that the row
with the * next to it is the AddNew row so it really does not exist in
your DataSource. So, if you want to use Ciaran's suggestion of
interacting directly with the DataSource, then you would have to
actually add a new item (DataRow) in some manner, maybe calling
DataTable.NewRow, change the values in this new row, and then call
DataTable.Rows.Add to add the new row into the DataTable.

If you are only changing a single value in this new row, and want to do
it through the UI (and not directly work with the DataTable), then you
can try using SendKeys to simiulate keystrokes into the grid to set a
value, but there may be consequences of doing it this way. Manipulating
the data in the DataSource is probably the most robust way to do this.

           //set the current cell and set it editing
           this.dataGridView1.CurrentCell = this.dataGridView1[2, 10];
           this.dataGridView1.BeginEdit(true);
           //send the keystrokes and end the editing
           SendKeys.Send(SomeValue.ToString());
           this.dataGridView1.EndEdit();

=========================
Clay Burch
Syncfusion, Inc.
DanThMan - 25 Jan 2007 21:02 GMT
Thanks to both of you for your replies.

The problem is that I'm not creating a new row programmatically then
filling it with values. Rather, the user is interacting with the "row
for new records" and I'm programmatically entering values into that row
based on what the user does.

If I were just trying to add a new record entirely through code, I
could easily see how this would be done using the underlying DataTable.
But, in this case, if I were to add a new row to the DataTable when the
user interacts with row for new records, It seems like I'd just end up
with two unsync'd versions of the same row.

I like the SendKeys idea, but it only works for tables where there is a
visible DataGridViewTextBoxCell available to send input to. Sending
keys to a DataGridViewButtonCell, for example, doesn't trick the
DataGridView into thinking the row has been edited.

Is there really no way to simply set the status of a row to
edited/changed?

There seems to be a way to set the DirtyState of a cell to True
(NotifyCurrentCellDirty), but this still isn't enough to prevent the
problem of all values disappearing when the row loses focus. I also
can't seem to programmatically change the CurrentCell to any other type
of cell besides a DataGridViewTextBoxCell.

Right now, the only solution I can think of is to create a dummy
DataGridViewTextBoxColumn in a every table just so that I can use
SendKeys with it. Someone please tell me I don't have to resort to
something that kludgey!

Thanks again,

-Dan

> One other comment in addition to what Ciaran suggested is that the row
> with the * next to it is the AddNew row so it really does not exist in
[quoted text clipped - 20 lines]
> Clay Burch
> Syncfusion, Inc.
RobinS - 25 Jan 2007 22:09 GMT
Why can't you create a new row for your datatable, and put the user's
entries into it, then add it to the DataGridView?

What are you binding your datagridview to? Is it by chance a list of
objects? Or is it a datatable or dataset?

Robin S.
---------------------------------
> Thanks to both of you for your replies.
>
[quoted text clipped - 68 lines]
>> Clay Burch
>> Syncfusion, Inc.
DanThMan - 26 Jan 2007 07:01 GMT
It looks like the solution was to place the following code in the
DataGridView'sRowLeave event handler:

'make sure row is not empty
'binding = reference to the binding for the DataGridView
binding.SuspendBinding()
binding.ResumeBinding()

I'd feel better about this if I knew why it worked. I just sort of
stumbled upon it after playing with several different solutions,
including using SendKeys and adding a row to the DataTable.

Thanks for all the advice,

-Dan

> Why can't you create a new row for your datatable, and put the user's
> entries into it, then add it to the DataGridView?
[quoted text clipped - 76 lines]
> >> Clay Burch
> >> Syncfusion, Inc.
William LaMartin - 26 Jan 2007 16:41 GMT
I have found that if I want to be sure that changes to a cell in a
datagridview are made that I need to click on any other row before doing the
update command for the dataadapter.

I am sure there is another way.

> It looks like the solution was to place the following code in the
> DataGridView'sRowLeave event handler:
[quoted text clipped - 92 lines]
>> >> Clay Burch
>> >> Syncfusion, Inc.

Rate this thread:







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.