Editing in Xamarin.Android DataGrid

3 Sep 202015 minutes to read

The SfDataGrid supports editing the cell values by setting the SfDataGrid.AllowEditing property, SfDataGrid.NavigationMode as Cell and setting the SfDataGrid.SelectionMode as any other than None.

The following code example shows how to enable editing in the SfDataGrid.

  • C#
  • dataGrid.AllowEditing = true;
    dataGrid.SelectionMode = SelectionMode.Multiple;
    dataGrid.NavigationMode = NavigationMode.Cell;

    Xamarin.Android DataGrid with editing

    Column editing

    You can enable or disable editing for a particular column by setting the GridColumn.AllowEditing property.

  • C#
  • GridTextColumn column = new GridTextColumn();
    column.AllowEditing = false;

    NOTE

    GridColumn.AllowEditing has higher priority than SfDataGrid.AllowEditing.

    Entering edit mode

    You can enter into edit mode by just tapping or double tapping the grid cells by setting the SfDataGrid.EditTapAction property.

  • C#
  • //Enter edit mode in single tap
    this.dataGrid.EditTapAction = TapAction.OnTap;
    //Enter edit mode in double tap
    this.dataGrid.EditTapAction = TapAction.OnDoubleTap;

    Cursor behavior

    When the cell enters into edit mode, the cursor is placed based on the SfDataGrid.EditorSelectionBehavior property.

    • SelectAll: selects the text of edit element loaded inside the cell.
    • MoveLast: places the cursor at the last of edit element loaded inside the cell.
  • C#
  • //Selects all the text in the edit mode
    this.dataGrid.EditorSelectionBehavior = EditorSelectionBehavior.SelectAll;
    //Places the cursor at the last
    this.dataGrid.EditorSelectionBehavior = EditorSelectionBehavior.MoveLast;

    NOTE

    Editing supports UserCellTypeColumn, and GridUnboundColumn are not provided yet.

    Supports IEditableObject

    The SfDataGrid supports committing and rolling back the changes in row level when the underlying data object implements the IEditableObject interface.

    The editing changes in a row will be committed only when moving to the next row by tapping.

    IEditableObject has the following methods to capture editing:

    • BeginEdit: Called to begin edit on the underlying data object when cell in a row enters into edit mode.
    • CancelEdit: Called when canceling editing to discard the changes in a row since last BeginEdit call.
    • EndEdit: Called when moving to the next row by tapping to commit changes in the underlying data object since last BeginEdit call.

    Following code snippet explains the simple implementation of IEditableObject.

  • C#
  • public class OrderInfo : INotifyPropertyChanged, IEditableObject
    {
        public OrderInfo()
        {
        }
    
        private int _orderID;
        private int _employeeID;
        private int _customerID;
        private bool _isClosed;
        private string _firstName;
        private string _lastName;
        private string _gender;
        private string _shipCity;
        private string _shipCountry;
        private string _freight;
        private DateTime _shippingDate;
    
        public int OrderID
        {
            get { return _orderID; }
            set
            {
                this._orderID = value;
                RaisePropertyChanged("OrderID");
            }
        }
    
        public int EmployeeID
        {
            get { return _employeeID; }
            set
            {
                this._employeeID = value;
                RaisePropertyChanged("EmployeeID");
            }
        }
    
        public int CustomerID
        {
            get { return _customerID; }
            set
            {
                this._customerID = value;
                RaisePropertyChanged("CustomerID");
            }
        }
    
        public bool IsClosed
        {
            get { return _isClosed; }
            set
            {
                this._isClosed = value;
                RaisePropertyChanged("IsClosed");
            }
        }
    
        public string FirstName
        {
            get { return _firstName; }
            set
            {
                this._firstName = value;
                RaisePropertyChanged("FirstName");
            }
        }
    
        public string LastName
        {
            get { return _lastName; }
            set
            {
                this._lastName = value;
                RaisePropertyChanged("LastName");
            }
        }
    
        public string Gender
        {
            get { return _gender; }
            set
            {
                this._gender = value;
                RaisePropertyChanged("Gender");
            }
        }
    
        public string ShipCity
        {
            get { return _shipCity; }
            set
            {
                this._shipCity = value;
                RaisePropertyChanged("ShipCity");
            }
        }
    
        public string ShipCountry
        {
            get { return _shipCountry; }
            set
            {
                this._shipCountry = value;
                RaisePropertyChanged("ShipCountry");
            }
        }
    
        public string Freight
        {
            get { return _freight; }
            set
            {
                this._freight = value;
                RaisePropertyChanged("Freight");
            }
        }
    
        public DateTime ShippingDate
        {
            get { return _shippingDate; }
            set
            {
                this._shippingDate = value;
                RaisePropertyChanged("ShippingDate");
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
    	private void RaisePropertyChanged (String Name)
    	{
    		if (PropertyChanged != null)
    			this.PropertyChanged (this, new PropertyChangedEventArgs (Name));
    	}
    
        private Dictionary<string, object> storedValues;
    
    
        public void BeginEdit()
        {
            this.storedValues = this.BackUp();
        }
    
        public void CancelEdit()
        {
            if (this.storedValues == null)
                return;
    
            foreach (var item in this.storedValues)
            {
                var itemProperties = this.GetType().GetTypeInfo().DeclaredProperties;
                var pDesc = itemProperties.FirstOrDefault(p => p.Name == item.Key);
                if (pDesc != null)
                    pDesc.SetValue(this, item.Value);
            }
        }
    
        public void EndEdit()
        {
            if (this.storedValues != null)
            {
                this.storedValues.Clear();
                this.storedValues = null;
            }
            Debug.WriteLine("End Edit Called");
        }
    
        protected Dictionary<string, object> BackUp()
        {
            var dictionary = new Dictionary<string, object>();
            var itemProperties = this.GetType().GetTypeInfo().DeclaredProperties;
            foreach (var pDescriptor in itemProperties)
            {
                if (pDescriptor.CanWrite)
                    dictionary.Add(pDescriptor.Name, pDescriptor.GetValue(this));
            }
            return dictionary;
        }
    }

    Editing events

    The SfDataGrid triggers the following events while editing.

    CurrentCellBeginEdit

    The SfDataGrid.CurrentCellBeginEdit event occurs when the CurrentCell enters into edit mode. The GridCurrentCellBeginEditEventArgs has the following members which provides information for the SfDataGrid.CurrentCellBeginEdit event.

    • Cancel : When set to ‘true’, the event is canceled and the CurrentCell does not enter into the edit mode.
    • RowColumnIndex : Gets the current row and column index of the DataGrid.
    • Column : Gets the grid column of the SfDataGrid.

    To hook the SfDataGrid.CurrentCellBeginEdit event, follow the code example.

  • C#
  • this.dataGrid.CurrentCellBeginEdit += DataGrid_CurrentCellBeginEdit;
    
    private void DataGrid_CurrentCellBeginEdit(object sender, GridCurrentCellBeginEditEventArgs args)
    {
        // Editing prevented for the cell at RowColumnIndex(2,2).
        if (args.RowColumnIndex == new RowColumnIndex(2, 2))
            args.Cancel = true;
    }

    CurrentCellEndEdit

    The CurrentCellEndEdit event occurs when the CurrentCell exits the edit mode. The GridCurrentCellEndEditEventArgs has following members which provides information for the SfDataGrid.CurrentCellEndEdit event.

    • RowColumnIndex : Gets the current row and column index of the DataGrid.
    • Cancel : When set to ‘true’, the event is canceled and the edited value is not committed in the underlying collection.

    To hook the SfDataGrid.CurrentCellEndEdit event, follow the code example.

  • C#
  • this.dataGrid.CurrentCellEndEdit += DataGrid_CurrentCellEndEdit;
    
    private void DataGrid_CurrentCellEndEdit(object sender, GridCurrentCellEndEditEventArgs args)
    {
        // Editing prevented for the cell at RowColumnIndex(1,3).
        if (args.RowColumnIndex == new RowColumnIndex(1,3))
            args.Cancel = true;
    }

    Programmatically edit a cell

    Begin editing

    The SfDataGrid allows editing the cell programmatically by calling the SfDataGrid.BeginEdit method. Calling this method makes that particular cell enter the edit mode after which you can edit the data manually or programmatically. The following code example shows how to edit a cell programmatically.

  • C#
  • this.dataGrid.Loaded += dataGrid_Loaded;
    void dataGrid_Loaded(object sender, RoutedEventArgs e)
    {
        //Edit the cell at 2nd row,2nd column programmatically
        this.dataGrid.BeginEdit(2, 2);
    }

    End editing

    You can call the SfDataGrid.EndEdit method to programmatically end editing. A cell that is currently in edit mode commits the edited value to the underlying collection and exits the edit mode when this method is called. The following code example shows how to end the editing programmatically.

  • C#
  • this.dataGrid.EndEdit();

    Cancel editing

    You can call the SfDatagrid.CancelEdit method to programmatically cancel the editing. A cell that is currently in edit mode exits without committing the edited value in the underlying collection when this method is called. The following code example shows how to cancel the editing programmatically.

  • C#
  • this.dataGrid.CancelEdit();

    How to

    Cancel editing

    You can use the SfDataGrid.CurrentCellBeginEdit event to cancel the editing operation for the corresponding cell. The following code example shows how to cancel the editing operation using the SfDataGrid.CurrentCellBeginEdit event.

  • C#
  • this.dataGrid.CurrentCellBeginEdit += DataGrid_CurrentCellBeginEdit;
    private void DataGrid_CurrentCellBeginEdit(object sender, GridCurrentCellBeginEditEventArgs args)
    {
        if (args.Column.MappingName == "OrderID" || args.RowColumnIndex.RowIndex == 2)
            args.Cancel = true;
    }

    Cancel edited value from getting committed

    You can prevent the edited value from getting committed using the SfDataGrid.CurrentCellEndEdit event. The following code example shows how to prevent the edited values from getting committed in the underlying collection.

  • C#
  • this.dataGrid.CurrentCellEndEdit += DataGrid_CurrentCellEndEdit;
    
    private void DataGrid_CurrentCellEndEdit(object sender, GridCurrentCellEndEditEventArgs args)
    {
        if (args.RowColumnIndex.RowIndex == 2)
            args.Cancel == true;
    }