views:

291

answers:

2

It's been many years since I've used this "API" (yes, in quotes, as it's possibly the most confusing API I've ever come across!)

My need is a very simple one. I want to subscribe to an event that tells me that a cell's content has changed and what the new content is.

There are a thousand and one events fired that tell you when a cell has changed, but when you query the .Text property of the associated GridStyleInfo for the cell, it always tells you what it WAS and not what it IS.

This is fair enough for events like CurrentCellChanging or CurrentCellValidating. I've read that you can ask the 'Renderer' of the current cell for it's value during these events.

What doesn't seem right to me is when I subscribe to CurrentCellValidated - the cells text is still the old value. So, CurrentCellValidated (I assume) means that the cell's content has changed, validation has started, validation has ended, validation has succeeded, but... what's been validated and where is it?

I know what my next question on StackOverflow is going to be - I'll give you a hint: it contains the words 'SyncFusion', 'Grid', 'Alternative'!!

Cheers,

Steve

+2  A: 

The CurrentCellValidated event is raised before the changed value is moved into the undeerlying style object. If you want to catch the change after the changed value has been moved into the underlying style object, then try using the CurrentCellAcceptedChanged event. Here is some that shows how to use both events.

       private void Form1_Load(object sender, EventArgs e)
        {
            this.gridControl1.CurrentCellValidated += new EventHandler(gridControl1_CurrentCellValidated);
            this.gridControl1.CurrentCellAcceptedChanges += new CancelEventHandler(gridControl1_CurrentCellAcceptedChanges);
        }

        void gridControl1_CurrentCellAcceptedChanges(object sender, CancelEventArgs e)
        {
            GridCurrentCell cc = gridControl1.CurrentCell;
            Console.WriteLine("gridControl1_CurrentCellAcceptedChanges cell ({0},{1}) changed to: {2}", cc.RowIndex, cc.ColIndex, gridControl1[cc.RowIndex, cc.ColIndex].CellValue);

        }

        void gridControl1_CurrentCellValidated(object sender, EventArgs e)
        {
            GridCurrentCell cc = gridControl1.CurrentCell;
            Console.WriteLine("gridControl1_CurrentCellValidated cell ({0},{1}) changed to: {2}", cc.RowIndex, cc.ColIndex, cc.Renderer.ControlText);
        }
Clay B
+2  A: 

As Clay said, CurrentCellAcceptedChanges event would be the correct place to get the value after it has been stored to the GridStyleInfo.

Adding more info - Grid raises the CurrentCellValidating before it does any validations. If you look at the GridStyleInfo, there are properties like CellValueType (int, decimal, datetime, etc), Format and CultureInfo. When you set these properties, Grid would parse the cellvalues based on these. In case of bound controls - GridDataBoundGrid or GridGroupingControl, it would read it from the datasource's schema (if available).

So CurrentCellValidating is fired before any validations, CurrentCellValidation is fired after Grid does it's parsing and before it saves to the GridStyleInfo.CellValue.

Jay