We use cookies to give you the best experience on our website. If you continue to browse, then you agree to our privacy policy and cookie policy.
Unfortunately, activation email could not send to your email. Please try again.

Null cell value after editing cell on gridgroupingcontrol bound to BindingList object

Thread ID:

Created:

Updated:

Platform:

Replies:

131827 Jul 28,2017 08:37 PM Aug 1,2017 03:00 AM Windows Forms 3
loading
Tags: GridGroupingControl
Charles Chacon
Asked On July 28, 2017 08:37 PM

Using control from Essential Studio 14.4.0.15 with project references to control version 14.4451.0.15.

I've created a class with a couple of properties and bound a BindingList to a gridgroupingcontrol.

  internal class GenericConfiguration : INotifyPropertyChanged
  {
    //Implement INotifyPropertyChanged so that GridGroupingControl
    //in Configuration form can update the bound List<GenericConfiguration>.
    public event PropertyChangedEventHandler PropertyChanged;

    private dynamic _settingValue;

    public string SettingName { get; set; }
    public dynamic SettingValue
    {
      get { return _settingValue; }
      set 
      {
        bool bVal;
        if (bool.TryParse(value, out bVal)) {
          if (_settingValue != bVal) {
            _settingValue = bVal;
            RaisePropertyChanged();
          }
        }
        else if (_settingValue != value) {
          _settingValue = value;
          RaisePropertyChanged();
        }
      }
    }

    public GenericConfiguration() {}

    public GenericConfiguration(string Name, dynamic Value)
    {
      this.SettingName = Name;
      _settingValue = Value;
    }

    void RaisePropertyChanged([CallerMemberName] string PropName = "")
    {
      PropertyChangedEventHandler handlerPC = PropertyChanged;
      if (handlerPC != null) {
        handlerPC(this, new PropertyChangedEventArgs(PropName));
      }
    }
  }

I run my project and pull up the Configuration screen.  When I try to edit a SettingValue cell, the value I had just typed is replaced by a null value after clicking another cell.  I've tried looking for a solution here and elsewhere without success.  I've even looked at a demo using this control from one of your knowledgebase articles.  I've tried running tests with and without QueryCellStyleInfo event handler.  Funny thing is that with the QueryCellStyleInfo event handler, the gridgroupingcontrol does pass the changed value on a cell with a dropdown but on a cell without a dropdown it passes 'null' (see pics at the bottom).

Below is the code for my Configuration form:

  public partial class Configuration : Form
  {

    BindingList<GenericConfiguration> _lstSettings = new BindingList<GenericConfiguration>();
    StringCollection _lstBools = new StringCollection { "true", "false" };


    public Configuration()
    {
      InitializeComponent();
    }

    private void Configuration_Load(object sender, EventArgs e)
    {
      _lstSettings = Global.AppConfiguration.GetConfigDisplaySettingsListTest();
      ggcSettings.DataSource = _lstSettings;
      ggcSettings.ShowColumnHeaders = true;
      ggcSettings.BackColor = Color.SandyBrown;
      ggcSettings.TableOptions.ListBoxSelectionMode = SelectionMode.One;
      
    }


    private void ggcSettings_QueryCellStyleInfo(object Sender, GridTableCellStyleInfoEventArgs e)
    {
      Debug.Print("r: " + e.Style.TableCellIdentity.RowIndex + " c: " + e.Style.TableCellIdentity.ColIndex + "  val: " + e.Style.CellValue);
      //string d = "row: {0}  col: {1} - {2}";
      //Debug.Print(string.Format(d, e.TableCellIdentity.RowIndex, e.TableCellIdentity.ColIndex, e.Style.CellValue.ToString() + ""));

      if (e.TableCellIdentity.RowIndex > 1)
      {
        if (e.TableCellIdentity.ColIndex == 1)
        {
          e.Style.Enabled = false;
        }
        if (e.TableCellIdentity.ColIndex == 2)
        {
          if (e.Style.CellValue != null)
            if ((e.Style.CellValue.ToString() != ""))
            {
              if (_lstSettings[e.TableCellIdentity.RowIndex - 2].SettingValue.GetType() == typeof(Boolean))
              {
                e.Style.CellType = "ComboBox";
                e.Style.ChoiceList = _lstBools;
                e.Style.DropDownStyle = Syncfusion.Windows.Forms.Grid.GridDropDownStyle.AutoComplete;
                e.Style.AutoCompleteInEditMode = Syncfusion.Windows.Forms.Grid.GridComboSelectionOptions.AutoComplete;
              }
              else
              {
                e.Style.CellType = "TextBox";
                e.Style.ReadOnly = false;

              }

            }
        }

      }
    }

  }

Below are my testing pics when NOT using QueryCellStyleInfo handler:

 
 

Below are testing pics when using QueryCellStyleInfo event handler:
 
 


Your help is much appreciated.


Mohanraj Gunasekaran [Syncfusion]
Replied On July 31, 2017 06:33 AM

Hi Charles,  
 
Thanks for using Syncfusion product.  
 
By default, GridGroupingControl does not have the support for dynamic type of field in datasource collection. In order to overcome this scenario, you can use the SaveCellFormattedText event. Please refer to the below code example and sample,  
  
Code example  
this.gridGroupingControl1.SaveCellFormattedText += GridGroupingControl1_SaveCellFormattedText;  
  
private void GridGroupingControl1_SaveCellFormattedText(object sender,GridCellTextEventArgs e)  
{  
    bool value;  
    if (bool.TryParse(e.Text, out value))  
        e.Style.CellValueType = typeof(bool);  
    else  
        e.Style.CellValueType = typeof(string);  
}  
  
Sample link: GridGroupingControl  
 
Regards,  
Mohanraj G  
 


Charles Chacon
Replied On July 31, 2017 03:25 PM

Mohanraj,

Outstanding!  So, basically the control needs to have the types defined in e.Style.CellValueType.

What I did to simplify my code was to assign the types in QueryCellStyleInfo event and now I don't need to Parse for a boolean when setting the GenericConfiguration.SettingValue property:

    private void ggcSettings_QueryCellStyleInfo(object Sender, GridTableCellStyleInfoEventArgs e)

    {

      Debug.Print("r: " + e.Style.TableCellIdentity.RowIndex + " c: " + e.Style.TableCellIdentity.ColIndex + "  val: " + e.Style.CellValue);

      //string d = "row: {0}  col: {1} - {2}";

      //Debug.Print(string.Format(d, e.TableCellIdentity.RowIndex, e.TableCellIdentity.ColIndex, e.Style.CellValue.ToString() + ""));


      if (e.TableCellIdentity.RowIndex > 1)

      {

        if (e.TableCellIdentity.ColIndex == 1)

        {

          e.Style.Enabled = false;

        }

        if (e.TableCellIdentity.ColIndex == 2)

        {

          if (e.Style.CellValue.ToString() != "")

          {

            if (_lstSettings[e.TableCellIdentity.RowIndex - 2].SettingValue.GetType() == typeof(Boolean))

            {

              e.Style.CellType = "ComboBox";

              e.Style.CellValueType = typeof(Boolean);

              e.Style.ChoiceList = _lstBools;

              e.Style.DropDownStyle = Syncfusion.Windows.Forms.Grid.GridDropDownStyle.AutoComplete;

              e.Style.AutoCompleteInEditMode = Syncfusion.Windows.Forms.Grid.GridComboSelectionOptions.AutoComplete;

            }

            else

            {

              e.Style.CellValueType = _lstSettings[e.TableCellIdentity.RowIndex - 2].SettingValue.GetType();

            }


          }

          else

          {

            e.Style.CellValueType = _lstSettings[e.TableCellIdentity.RowIndex - 2].SettingValue.GetType();

          }

        }


      }

    }


  internal class GenericConfiguration : INotifyPropertyChanged

  {

  ...
    public dynamic SettingValue
    {
      get { return _settingValue; }
      set 
      {
        if (_settingValue != value)
        {
          _settingValue = value;
          RaisePropertyChanged();
        }
      }
    }
   ...
   }

Thanks very much for the help!



Mohanraj Gunasekaran [Syncfusion]
Replied On August 1, 2017 03:00 AM

Hi Charles, 

Thanks for your update. 

Yes, you can also set the type for fields using QueryCellStyleInfo event.  

Anyway, we are glad to know that your reported problem has resolved. 

Please let us know, if you have any concerns. 

Regards, 
Mohanraj G 


CONFIRMATION

This post will be permanently deleted. Are you sure you want to continue?

Sorry, An error occured while processing your request. Please try again later.

You are using an outdated version of Internet Explorer that may not display all features of this and other websites. Upgrade to Internet Explorer 8 or newer for a better experience.

;