BindingSource in Infragistics UltraGrid not responding to delete command

BindingSource in Infragistics UltraGrid not responding to delete command

Old forum URL: forums.lhotka.net/forums/t/8779.aspx


Lord02 posted on Wednesday, April 07, 2010

-- Edit 3 --- LATEST reply:

I guess I **could** track the keyDown in the Grid ... if's "DEL" button, then mark the _project ( CSLA class, editableRoot ) as deleted ... and then always use the SAVE button to triggers the changes ??

But that CANNOT be the best way ... I need to be able to codeBehind the "delete event" of the Grid or actually it should notify the CSLA datasource to delete itself when pushing the "DEL" button ... at least the entry is deleted from the Grid, so that's the supposed behaviour I guess

Please help

-------------------------------------------

 

--Edit 2 ---

Normal 0 21 false false false IS X-NONE X-NONE MicrosoftInternetExplorer4

…now doing it with a button outside of the UltraGrid … kind of sucks, but works L

 

private void _btnDelete_Click(object sender, EventArgs e)

        {           

            Core.Project.DeleteProject(_project.ProjectID);

            _projectBindingSource.DataSource = null; //just to clear the Grid

 

            //also clear the combo that selects projects:

            Core.ProjectNameValueList.InvalidateCache();

            _ucProjectsNameValue.SelectedRow = null;

            _projectNameValueList = Core.ProjectNameValueList.GetAll();

            _projectNameValueListBindingSource.DataSource = _projectNameValueList;           

        }

 

I would much rather be able to hit "DEL" on the keyboard and not only make the Grid delete the row in the grid, but also make the delete call to the CSLA object !

------

 

 

--- EDIT ----

I found out how to delete with a BUTTON, but I want to use the "DEL" button on the keyboard for deletion, how would I do that ? I've already managed to do it like this with a button:

private void _btnDelete_Click(object sender, EventArgs e)
        {
            //_projectBindingSource.EndEdit();           
            Core.Project.DeleteProject(_project.ProjectID);
            //_projectBindingSource.DataSource = _project;

            //FillProjectsDropDown(); //in case name of some project has changed
        }

----------------------------------------

Hi there!

Do you think of any possible reason my BindingSource which is bound against a EditableRoot, does not respond to the DEL ( button on keyboard ) for deleting my databound object ? ( The grid warns me that I'm going to delete the selected record, and when I press yes it's removed from the GRID, but nothing is called in my CSLA object ).

The update works very well ( there's no insert as this is an EditableRoot ), in the GRID and into the DataPortal_Update ...and hence gets updated successfully in the database as well.

Is there anything special I need to implement so the CSLA object will delete itself in ? I'm using the CodeSmith templates against CSLA v3.8.1 ( I have found Codesmith excellent for generating the CSLA objects by the way! ).

is there any possible way for me to attach the CSLA class to this forum ? I'll paste a couple of lines ..
There's also nothing done in my Child ( EditableChild ) when I hit update/delete/insert
- it's only updated/deleted/inserted inside the grid ... but never called to the CSLA classes

This code is never entered when pushing the DEL button in the Grid ... and hence there's no deletion

The Databinding in the GUI:
public RecoveryUI()
        {
            InitializeComponent();
           
            //Fills the Grid:
            FillProjectsDropDown(); // This will load the parent and children into the Grid, databinded successfully
        }       

        private void FillGridWithSelectedProject(int projectId)
        {           
            /*_projectList = Core.ProjectList.GetByProjectID(projectId);
            projectListBindingSource.DataSource = _projectList;*/

            _project = Core.Project.GetByProjectID(projectId);
            _projectBindingSource.DataSource = _project;       
        }

public static void DeleteProject(System.Int32 projectID)
        {
            DataPortal.Delete(new ProjectCriteria {ProjectID = projectID});
        }

[Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_DeleteSelf()
        {
            bool cancel = false;
            OnSelfDeleting(ref cancel);
            if (cancel) return;
           
            DataPortal_Delete(new ProjectCriteria (ProjectID));
       
            OnSelfDeleted();
        }

[Transactional(TransactionalTypes.TransactionScope)]
        protected void DataPortal_Delete(ProjectCriteria criteria)
        {
            bool cancel = false;
            OnDeleting(criteria, ref cancel);
            if (cancel) return;

            using (SqlConnection connection = new SqlConnection(ADOHelper.ConnectionString))
            {
                connection.Open();
                using (SqlCommand command = new SqlCommand("[dbo].[rp_Project_Delete]", connection))
                {
                    command.CommandType = CommandType.StoredProcedure;
                    command.Parameters.AddRange(ADOHelper.SqlParameters(criteria.StateBag));

                    //result: The number of rows changed, inserted, or deleted. -1 for select statements; 0 if no rows were affected, or the statement failed.
                    int result = command.ExecuteNonQuery();
                    if (result == 0)
                        throw new DBConcurrencyException("The entity is out of date on the client. Please update the entity and try again. This could also be thrown if the sql statement failed to execute.");
                }
            }

            OnDeleted();
        }


Thank you,
EE

Lord02 replied on Wednesday, April 07, 2010

I just want to clarify that I'm using the standard System.Windows.Forms.BindingSource against the CSLA object

and the GUI is still very simple - it's simply done by this:

public partial class RecoveryUI : Form
    {
        //Core.ProjectList _projectList;
        Core.Project _project;
        Core.ProjectNameValueList _projectNameValueList;
        int _selectedProjectId;       

        public RecoveryUI()
        {
            InitializeComponent();
           
            //Fills the Grid:
            FillProjectsDropDown();
        }       

        private void FillGridWithSelectedProject(int projectId)
        {           
            /*_projectList = Core.ProjectList.GetByProjectID(projectId);
            projectListBindingSource.DataSource = _projectList;*/

            _project = Core.Project.GetByProjectID(projectId);
            _projectBindingSource.DataSource = _project;       
        }

        private void FillProjectsDropDown()
        {
            if( _projectNameValueList != null )
            {
                if (_projectNameValueList.Count > 0)
                    Core.ProjectNameValueList.InvalidateCache();
            }

            _projectNameValueList = Core.ProjectNameValueList.GetAll();
            _projectNameValueListBindingSource.DataSource = _projectNameValueList;
        }       

        private void _btnSaveProject_Click(object sender, EventArgs e)
        {       
            /*projectListBindingSource.EndEdit();
            _projectList = _projectList.Save();
            projectListBindingSource.DataSource = _projectList;*/

            _projectBindingSource.EndEdit();

            _project = _project.Save();
            _projectBindingSource.DataSource = _project;           

            FillProjectsDropDown(); //in case name of some project has changed
        }

        private void _ucProjectsNameValue_TextChanged(object sender, EventArgs e)
        {
            _selectedProjectId = Int32.Parse(_ucProjectsNameValue.SelectedRow.Cells["Key"].Value.ToString());
            FillGridWithSelectedProject(_selectedProjectId);           
        }

It's binding to the grid and displaying the children ( I can drill down to them, loaded with lazy loading ) ... but the DEL on the parent is not working, and no functions against the children ( update/delete/insert ) are working

I'll paste how the children ( EditableChildren ) are retrieved from the database:

public partial class Project
    {
        #region Custom Made Properties
        private static readonly PropertyInfo<MemberList> _membersProperty = RegisterProperty<MemberList>(p => p.Members, string.Empty, null);
        public MemberList Members
        {
            get { return GetProperty(_membersProperty); }
            set { SetProperty(_membersProperty, value); }
        }
        #endregion

        partial void OnMapping(Csla.Data.SafeDataReader reader, ref bool cancel)
        {
            try
            {   //loads the members (children) for the project
                LoadProperty(_membersProperty, MemberList.GetByParentID(Int32.Parse(reader["ProjectID"].ToString())));
            }
            catch (Exception) { }; // this is done in case there are no children ... default CSLA behaviour is to cast error on this and I'm not fond of it ... so I just catch the error upper and ignore it
        }

 

 

Lord02 replied on Wednesday, April 07, 2010

Is there any way can trigger the DEL ( which deletes from the GRID, not the datasource ) work on the CSLA object also ?

I'm now trying something like this ... which doesn't make sense I think, but if I do this I can see the CSLA object gets the status IsDeleted = true ... ( after the _project.Delete( )  )
but it does NOT enter this in the CSLA object:

public static void DeleteProject(System.Int32 projectID)
        {
            DataPortal.Delete(new ProjectCriteria {ProjectID = projectID});
        }

it just calls the BASE classe's Delete I guess ... ( behind the scenes ) - the delete I'm calling isn't taking any parameters ( hence ... it's the base Delete ... )

I'm trying something like this:

private void _btnSaveProject_Click(object sender, EventArgs e)
        {       
            /*projectListBindingSource.EndEdit();
            _projectList = _projectList.Save();
            projectListBindingSource.DataSource = _projectList;*/

            _projectBindingSource.EndEdit();
            _project = _project.Save();
            _projectBindingSource.DataSource = _project;           

            FillProjectsDropDown(); //in case name of some project has changed
        }

private void _btnDelete_Click(object sender, EventArgs e)
        {
            _projectBindingSource.EndEdit();
            _project = (Core.Project)_projectBindingSource.DataSource;           
            _project.Delete();     <--- calls the BusinessBase, baseClass       

            _projectBindingSource.DataSource = _project;

            FillProjectsDropDown(); //in case name of some project has changed
        }

 

 

ajj3085 replied on Thursday, April 08, 2010

Are you using an EditableRootListBase as the datasource?  If so, your delete code may be hitting an exception.  The row would only be removed from the grid if it was actually removed from the database.

Lord02 replied on Thursday, April 08, 2010

No, I'm actually not using a EditableRootListBase, but just a EditableRootBase ... because there can only be one "top" / "root"

But I'm thinking maybe I need a EditableRootListBase as the datasource for databinding, although the "list" will only contain one item ( and that root, will contain loads of children ) .... am I right ? I need to bind to a xxxxxListBase for the deletion to work ?

rgd,
EE

ajj3085 replied on Thursday, April 08, 2010

Do you mean a BusinessBase subclass?  That wouldn't support being bound to a grid, not in the normal way.  For grid behavior, you'd need to have a BusinessListBase, containing your single item, which would work as you want.  (The grid is wrapping your BO in a list anyway, but not one that supports databinding like a BLB would).

Then it becomes a question of... if you're only going to have one item ever, why use a grid at all?

Lord02 replied on Thursday, April 08, 2010

I need a Grid because this Project ( the root ) has MULTIPLE levels of Children, all kinds ( read only /    read/write  etc ... )

That's why I used a Grid ...

Implementing it now with a EditableRootLIST ... but when I hit "DEL" on the keyboard it says
"Unable to delete row: Invalid for root objects - use Delete instead" ?? I'm not doing anything in code-behind of the Grid, what method is being called in the CSLA when using this ... ? There's no static delete method in the EditableRootLIST I'm using ( understandably ) ... only "NewList", "GetByProjectId" and GetAll" - all makes sense

But how to delete the EditableRoot, from inside the EditableRootList ? I'm NOT implementing anything myself in the GUI, just fully databinded ...
so I'm **NOT** doing anything like for example:
         
Core.DeleteProject(_project.ProjectID);           
_projectBindingSource.DataSource = null; //just to clear the Grid

I want the List ( container / EditableRootList ) to call the EditableRoot items for me .... how to do it ?

rgd,
EE

Lord02 replied on Thursday, April 08, 2010

... and please note, I would like the deletion to go ahead immidielty, not just mark the item in the list for deletion and I have to call something like this:

_projectList[0].Delete();

I've tried debugging the list **after** the:
"Unable to delete row: Invalid for root objects - use Delete instead" ??

and I see the list is empty(contained 1 item before) - ( and therefore has no items with "IsDeleted" status in it ... so there's nothing to delete in the

private void _btnSaveProject_Click(object sender, EventArgs e)
        {       
            _projectListBindingSource.EndEdit();
            _projectList = _projectList.Save();

            _projectListBindingSource.DataSource = _projectList;     }

 

I also DO NOT want to use the .SAVE method to delete the items ... I just want them deleted the minute the user pushes "DEL" on the keyboard
( The Grid gives warning that you're deleting 1 row ... and then "Unable to delete row: Invalid for root objects - use Delete instead" ??

Lord02 replied on Thursday, April 08, 2010

Hi ...

I can understand you're pretty lost reading this :-)

This is about how to implement the deletion with CSLA

I'm getting this error now:
"Unable to delete row: Invalid for root objects - use Delete instead"

Can you please have a look at the bottom there ?
http://forums.lhotka.net/forums/p/8779/41772.aspx#41772

I've put a button on the Winform to check the deletion, and THIS is working:
Core.Project.DeleteProject(_projectList[0].ProjectID);

But I do NOT want to have this button ... I want the Grid to delete correctly from the EditableRoot, which is beneath the EditableRootList ( which is bound to the Grid )

Is there any EVENT on the Grid which let's me play with it?
Some "OnDeleted" ... where can I manipulate the event behind the "DEL" keyboard button on the Grid?

Any ideas ?

To get rid of this error I added the "MarkAsChild()" in the constructor of the EditableRoot ( which is "under" the EditableRootLIST which is databinded )  

 

internal

 

Project(SafeDataReader reader)
{
Map(reader);
MarkAsChild();
//Note: I added this
}

and now the DataPortal_Update of the EditableRootList is entered but there are no items ... because they've already been removed:

protected override void DataPortal_Update()
        {
            //this
            bool cancel = false;
            OnUpdating(ref cancel);
            if (cancel) return;

            RaiseListChangedEvents = false;

            foreach(Project item in Items) // here the items have already been removed!
            {
                item.Save(); <--- will never enter this because of it
            }

            RaiseListChangedEvents = true;

            OnUpdated();
        }

 

I'm debugging the EditableRootList now ... and it has DeletedList with one item ( which is the correct item ! )
but it never enter this, in the EditableRootList:
foreach(Project item in Items) // here the items have already been removed!
            {
                item.Save(); <--- will never enter this because of it
            }

 



help ?

rgd,
EE

ajj3085 replied on Thursday, April 08, 2010

Right.. but Project is a BB, correct?  You can display its values using other controls, and display its children in a grid, and it will be multiple levels since you're using Infragistics.

If you really want the top level item in a grid though, you need to create a new class which is an ERLB, has a factory method etc, and that ERLB will load up only the single root BB object in its fetch.  Then bind the new ERLB class to your binding source, and it should work properly.

You may want to read up on the first few chapters of the Expert C# 2008 Business Objects book, which explains the role of each of the Csla base class.

Lord02 replied on Thursday, April 08, 2010

Hi Andy,

What do you mean by "BB" ? :)

I was starting to think of exacly this, using a "Master" class as the root / container ... do you have an example of this ?

p.s. I've bought that book and read most of it ... where is this mention of this "new class"/master class as an ERLB ? ( what does ERLB stand for ? :) )

I was able to do the delete by this ... I marked the "Project" as MarkAsChild() in the fetch of it and then entered this:

protected override void RemoveItem(int index)
        {
            Project item = this[index];
            Project.DeleteProject(item.ProjectID);
        }

This WILL delete the record ... but not refresh the Grid :-(

 

I also noticed this:
-------------------------
foreach (Project deleted in DeletedList) <--- "DeletedList" ... that's exacly where the item is, BUT then I get the error "cannot delete a child" or something like that
            {
                deleted.Save();
            }


ajj3085 replied on Thursday, April 08, 2010

Hi, by BB I mean "BusinessBase subclass."  ERLB is EditableRootListBase, another Csla type.

Chapter 2, Framework design, page 68 of the C# book calls this stereotype a "Dynamic Root List."

Lord02 replied on Thursday, April 08, 2010

Andy,

I first want to try out this Dynamic Root List ... I've read the page 67 ( not 68 :-)  ) and it says it's specifically deisgned for my case ... that is, inside editing inside WinForms grids.

But can you "draw" up the classes I would use for that ?
e.g.
ProjectList ( DynamicRootList ) <--- databound to the Grid
   - Project  ( DynamicRoot )
         - Members ( EditableChildList? )
               - Member ( EditableChild ? )

Is it like that ?

Lord02 replied on Thursday, April 08, 2010

Would I need two dataSources for the binding on this one ... ?

How would you use this, and what is the class-structure tree like ?

I see that the DynamicRootList does not have a SAVE operations:

//------------------------------------------------------------------------------
// <autogenerated>
//     This code was generated using CodeSmith: v5.2.1, CSLA Templates: v2.0.1.1570, CSLA Framework: v3.8.2.
//     Changes to this file will be lost after each regeneration.
//     To extend the functionality of this class, please modify the partial class 'Project.cs'.
//
//     Template: DynamicRootList.Generated.cst
//     Template website: http://code.google.com/p/codesmith/
// </autogenerated>
//------------------------------------------------------------------------------
#region Using declarations

using System;

using Csla;

#endregion

namespace RecoveryPlanner.Business
{
    [Serializable]
    public partial class ProjectList : EditableRootListBase< Project >
    {
        #region Properties
       
        protected override object AddNewCore()
        {
            Project item = RecoveryPlanner.Business.Project.NewProject();
            Add(item);
            return item;
        }
       
        #endregion

        #region Factory Methods
       
        public static ProjectList NewList()
        {
            return DataPortal.Create< ProjectList >();
        }

        public static ProjectList GetAll()
        {
            return DataPortal.Fetch< ProjectList >(new ProjectCriteria());
        }

        public static ProjectList GetByProjectID(System.Int32 projectID)
        {
            return DataPortal.Fetch< ProjectList >(
                new ProjectCriteria{ProjectID = projectID});
        }

        private ProjectList()
        {
            AllowNew = true;
        }
       
        #endregion


        #region Exists Command

        public static bool Exists(ProjectCriteria criteria)
        {
            return RecoveryPlanner.Business.Project.Exists(criteria);
        }

        #endregion
    }
}

Lord02 replied on Thursday, April 08, 2010

I've been able to do the immidiete delete ! :-)

I did it by creating a Dynamic Root List, which is a container for the Projects ( EditableRoot ), and now insert/update/delete all work on-the-fly inside the Grid
at the top level, for all Projects

BUT ... now I can't insert/update/delete the "Members" which is EditableChildList container for EditableChilds
- the Grid removes them, but nothing get's called in the CSLA objects ...
What do I need to do to make the Project(EditableRoot) call the Children for Insert/Update/Delete ?

The Project(EditableRoot) has this inside it ( and it's fething the children just fine - just not inserting/update'ing/deleting ... I probably have to implement something in the Project do make it do it ?

Inside the Project ( EditableRoot ) is a member variable to reference the Children (Members):

private static readonly PropertyInfo<MemberList> _membersProperty = RegisterProperty<MemberList>(p => p.Members, string.Empty, null);
        public MemberList Members
        {
            get { return GetProperty(_membersProperty); }
            set { SetProperty(_membersProperty, value); }
        }
        #endregion

        partial void OnMapping(Csla.Data.SafeDataReader reader, ref bool cancel)
        {
            try
            {   //loads the members (children) for the project
                LoadProperty(_membersProperty, MemberList.GetByParentID(Int32.Parse(reader["ProjectID"].ToString())));
            }
            catch (Exception) { } // do nothing ... þetta er til að hindra villuna hans Lhotka þegar engin börn eru til staðar
        }

 

The problem is that the Project (EditableRoot) never calls the Child_Update( ) !
I shouldn't need to do something special I think ? If I create a new Member( EditableChild ) in the Grid and leave the cell ( remember, I'm using Dynamic Root List so I don't have to "push save" ... it happens immidietly after I leave the cells ) it enters the DataPortal_Update for the project ... but never calls the Child_XXXXX throught the Portal ...

If I breakpoint and edit the "this" ( Project ... which has the children ) the children are there correctly marked ( in the Members collection ) with "IsDirty" and "IsValid" and everything ... but somehow it never calls the Child's update ( and I can't do this.Member[x].Save because it's a child ... and I DO NOT want to do it either ). I've been looking at the flow pictures ( e.g. page 159 ( Figure 4-14 ) in the C# 2008 )

Is the mapping maybe done wrongly ? Why does the Project (EditableRoot ) not send the message on to it's children's DataPortal_XXXX ?

it's my understanding the FieldManager should should simplify the proccess of updaing the child objects when using the data portal ( which is what I want to do )

Hope you can answer me ......

rgd,
EE.

 

Please help ... I'm almost there :-)

ajj3085 replied on Friday, April 09, 2010

See this is where things will get weird.  Your Project object, which is a BusinessBase and root, when you're done editing that (ie. deleting the row, or click out of one of the cells onto another project row) will cause an immediate save.  But Project's children WON'T save when you click out from editing them.  They are only saved with the parent Project object.  So to trigger a save you'll need to edit a child, then edit the parent, then leave the row.

If you WANT the children to save as you leave the row (like Project does now), I think you'd have to have Project as a Root (and not editable in the grid, but by using other controls to allow changing of Projects properties).  Member would need to be a root object as well and Members would be an ERLB.

But I think you can see how this would lead to a confusing user experience.  Your best bet would be to get rid of the ProjectList, use text boxes, check boxes, etc to allow editing of Project properties, and the grid to edit the Members.  Project is a root, everything else is a child.. and just have a save button on your form to save the whole thing.

Remember, in Csla terms anything that can save itself is a Root.  A root is always also a parent, but a parent isn't always a root object.

ajj3085 replied on Friday, April 09, 2010

If you want to do the Dynamic Root list option, then all your editing would be in the grid.. no need for seperate controls for the root's fields.

In that case, you'd have ProjectList, an EditableRootListBase subclass (Dynamic root list stereotype).  Project, which is a root and subclasses BusinessBase.  Members, which would inherit BusinessListBase, and Member, which would inherit BusinessBase.

Then your one BindingSource would have the grid bound to it, and you'd set the BS' datasource to a ProjectList instance.

The only odd thing is that what you've described so far you'd only ever have one item in ProjectList.  Conceptually odd... but if that's the use case, then that's how it would work.

Lord02 replied on Thursday, April 08, 2010

Andy,

If I'm going to use that suggestion ...

"You can display its values using other controls, and display its children in a grid, and it will be multiple levels since you're using Infragistics."

Would I still databind against the UltraGrid it like this:

     - MembersList ( is currently editableChildList, but I would change it to EditableRootList? ) <--- only a "container" ( and I would have to implement a function which is something like MemberList.GetByParentID <-- ( which is the ProjectID )
                -  Members ( is currenctly EditableChild, but I would change it to EditableRoot? ) <--- this will be the top Level visible in the Grid

 

Trying to do and UPDATE now:

I've tried this and when I call:
private void _btnSaveProject_Click(object sender, EventArgs e)
        {       
            _projectListBindingSource.EndEdit();
            _projectList = _projectList.Save();
            _projectListBindingSource.DataSource = _projectList;           
        }

the _projectList will go down to the Project and call the DataPortal_Update there ... ** but doesn't go down to the Members ?? **
- The "Members" is never called

This is how Projects "own" the MembersList:

Inside the Projects ( EditableRoot ):
---------------------------------------------------
#region Custom Made Properties
        private static readonly PropertyInfo<MemberList> _membersProperty = RegisterProperty<MemberList>(p => p.Members, string.Empty, null);
        public MemberList Members
        {
            get { return GetProperty(_membersProperty); }
            set { SetProperty(_membersProperty, value); }
        }
        #endregion

        partial void OnMapping(Csla.Data.SafeDataReader reader, ref bool cancel)
        {
            try
            {   //loads the members (children) for the project
                LoadProperty(_membersProperty, MemberList.GetByParentID(Int32.Parse(reader["ProjectID"].ToString())));
            }           
        }     

Would be nice if I could attached the CSLA classes in this forum ...

rgd,
EE

ajj3085 replied on Thursday, April 08, 2010

Ok, if you're going to try my original suggestion, this is what your class design would be like:

Project : BusinessBase<Project>

ProjectMembers : BusinessListBase<ProjectMembers, ProjectMember>

ProjectMember : BusinessBase<ProjectMember> // I assume this class would also have a Members property, of type ProjectMembers.

The on your from, you'll have two BindingSource components (ProjectBindingSource, MembersBindingSource).  You'd set ProjectBindingSource's DataSource property to a Project instance.  MembersBindingSource would have a DataSource property of ProjectBindingSource, and a DataMember of Members (or whatever your property name is).  That can all be setup in the designer.

 

I'm thrown by your "Projects" type though.  Sounds like it would be a collection of projects... which is fine, but not something I'd expect to support editing, just used as a kind of list for display.  You should be able to make a jpg of your current class diagram and attach it to your post.

Lord02 replied on Thursday, April 08, 2010

You know what I'm missing ?

I can see the framework is trying to call the DeleteChild( ) ?

http://csharp.codefetch.com/example/f1/cslacs10/CSLA/BusinessBase.cs

// allow the parent object to delete us
// (internal scope)
internal void DeleteChild()
{
if(!this.IsChild)
throw new NotSupportedException("Invalid for root objects " +
"- use Delete instead"
);

MarkDeleted();
}

How can I delete and EditableRoot from EditableRootList which is databound ? What do I need to implement ...

rgd,
EE

Copyright (c) Marimer LLC