Select to view content in your preferred language

EditBox Text Property

387
1
Jump to solution
12-12-2024 01:04 PM
mstranovsky
Occasional Contributor

How can you push a string to the EditBox control from say a button control.  For instance, i would like to click on a button in the addin ribbon that would send a string to the EditBox text property.

0 Kudos
1 Solution

Accepted Solutions
CharlesMacleod
Esri Regular Contributor

Here are two ways to do it. One uses an event which keeps the button and edit box loosely coupled, the other uses a direct reference where the button updates the edit box directly. The loosely coupled is the most flexible but is a bit more work than simply updating the edit box text - and, if that is literally all u need, then its overkill.

button_and_editbox.png

 

public class DateTimeStringChangedEventArgs : EventBase
{
  public string OldDateTimeString { get; private set; }
  public string NewDateTimeString { get; private set; }

  public DateTimeStringChangedEventArgs(string oldDateTimeString, string newDateTimeString)
  {
    OldDateTimeString = oldDateTimeString;
    NewDateTimeString = newDateTimeString;
  }
}

public class DateTimeStringChangedEvent : 
  CompositePresentationEvent<DateTimeStringChangedEventArgs>
{

  public static SubscriptionToken Subscribe(
    Action<DateTimeStringChangedEventArgs> action, bool keepSubscriberReferenceAlive = false)
  {
    return FrameworkApplication.EventAggregator.GetEvent<DateTimeStringChangedEvent>()
        .Register(action, keepSubscriberReferenceAlive);
  }

  public static void Unsubscribe(Action<DateTimeStringChangedEventArgs> subscriber)
  {
    FrameworkApplication.EventAggregator.GetEvent<DateTimeStringChangedEvent>()
      .Unregister(subscriber);
  }

  public static void Unsubscribe(SubscriptionToken token)
  {
    FrameworkApplication.EventAggregator.GetEvent<DateTimeStringChangedEvent>()
      .Unregister(token);
  }

  internal static void Publish(DateTimeStringChangedEventArgs payload)
  {
    FrameworkApplication.EventAggregator.GetEvent<DateTimeStringChangedEvent>()
       .Broadcast(payload);
  }
}

internal class Module1 : Module
{
  private static Module1 _this = null;

  private string _dateTimeString = 
    DateTime.Now.ToString("G", CultureInfo.CurrentCulture);

  public string DateTimeString
  {
    get
    {
       return _dateTimeString;
    }
    set
    {
      var args = new DateTimeStringChangedEventArgs(
                       _dateTimeString, value);
      _dateTimeString = value;
      //Raise the event
      DateTimeStringChangedEvent.Publish(args);
    }
  }

  public EditBoxDirectApproach EditBoxDirectApproach { get; set; } = null;

  ...
}

internal class Button1 : Button
{
  protected override void OnClick()
  {
    var date_string = DateTime.Now.ToString("G", CultureInfo.CurrentCulture);
    //Indirect, loose-coupling
    Module1.Current.DateTimeString = date_string;

    //Direct, direct-coupled
    Module1.Current.EditBoxDirectApproach.Text = date_string;
  }
}


internal class EditBoxIndirectApproach : EditBox
{
  public EditBoxIndirectApproach()
  {
    Initialize();
  }

  private bool _ignoreEvents = false;

  private void Initialize()
  {
    //This will invoke OnTextChange which is ok
    //as we havent subscribed to the event yet
    this.Text = Module1.Current.DateTimeString;

    DateTimeStringChangedEvent.Subscribe((args) =>
    {
      _ignoreEvents = true;
      try
      {
        //Invokes OnTextChange 
        this.Text = args.NewDateTimeString;
      }
      finally
      {
        _ignoreEvents = false;
      }
    });
  }

  protected override void OnTextChange(string text)
  {
    //prevent (infinite) recursion
    if (_ignoreEvents)
      return;

    Module1.Current.DateTimeString = text;
    base.OnTextChange(text);
  }
}

internal class EditBoxDirectApproach : EditBox
{
  public EditBoxDirectApproach()
  {
    Module1.Current.EditBoxDirectApproach = this;
    this.Text = DateTime.Now.ToString("G", CultureInfo.CurrentCulture);
  }
}

 

 

View solution in original post

1 Reply
CharlesMacleod
Esri Regular Contributor

Here are two ways to do it. One uses an event which keeps the button and edit box loosely coupled, the other uses a direct reference where the button updates the edit box directly. The loosely coupled is the most flexible but is a bit more work than simply updating the edit box text - and, if that is literally all u need, then its overkill.

button_and_editbox.png

 

public class DateTimeStringChangedEventArgs : EventBase
{
  public string OldDateTimeString { get; private set; }
  public string NewDateTimeString { get; private set; }

  public DateTimeStringChangedEventArgs(string oldDateTimeString, string newDateTimeString)
  {
    OldDateTimeString = oldDateTimeString;
    NewDateTimeString = newDateTimeString;
  }
}

public class DateTimeStringChangedEvent : 
  CompositePresentationEvent<DateTimeStringChangedEventArgs>
{

  public static SubscriptionToken Subscribe(
    Action<DateTimeStringChangedEventArgs> action, bool keepSubscriberReferenceAlive = false)
  {
    return FrameworkApplication.EventAggregator.GetEvent<DateTimeStringChangedEvent>()
        .Register(action, keepSubscriberReferenceAlive);
  }

  public static void Unsubscribe(Action<DateTimeStringChangedEventArgs> subscriber)
  {
    FrameworkApplication.EventAggregator.GetEvent<DateTimeStringChangedEvent>()
      .Unregister(subscriber);
  }

  public static void Unsubscribe(SubscriptionToken token)
  {
    FrameworkApplication.EventAggregator.GetEvent<DateTimeStringChangedEvent>()
      .Unregister(token);
  }

  internal static void Publish(DateTimeStringChangedEventArgs payload)
  {
    FrameworkApplication.EventAggregator.GetEvent<DateTimeStringChangedEvent>()
       .Broadcast(payload);
  }
}

internal class Module1 : Module
{
  private static Module1 _this = null;

  private string _dateTimeString = 
    DateTime.Now.ToString("G", CultureInfo.CurrentCulture);

  public string DateTimeString
  {
    get
    {
       return _dateTimeString;
    }
    set
    {
      var args = new DateTimeStringChangedEventArgs(
                       _dateTimeString, value);
      _dateTimeString = value;
      //Raise the event
      DateTimeStringChangedEvent.Publish(args);
    }
  }

  public EditBoxDirectApproach EditBoxDirectApproach { get; set; } = null;

  ...
}

internal class Button1 : Button
{
  protected override void OnClick()
  {
    var date_string = DateTime.Now.ToString("G", CultureInfo.CurrentCulture);
    //Indirect, loose-coupling
    Module1.Current.DateTimeString = date_string;

    //Direct, direct-coupled
    Module1.Current.EditBoxDirectApproach.Text = date_string;
  }
}


internal class EditBoxIndirectApproach : EditBox
{
  public EditBoxIndirectApproach()
  {
    Initialize();
  }

  private bool _ignoreEvents = false;

  private void Initialize()
  {
    //This will invoke OnTextChange which is ok
    //as we havent subscribed to the event yet
    this.Text = Module1.Current.DateTimeString;

    DateTimeStringChangedEvent.Subscribe((args) =>
    {
      _ignoreEvents = true;
      try
      {
        //Invokes OnTextChange 
        this.Text = args.NewDateTimeString;
      }
      finally
      {
        _ignoreEvents = false;
      }
    });
  }

  protected override void OnTextChange(string text)
  {
    //prevent (infinite) recursion
    if (_ignoreEvents)
      return;

    Module1.Current.DateTimeString = text;
    base.OnTextChange(text);
  }
}

internal class EditBoxDirectApproach : EditBox
{
  public EditBoxDirectApproach()
  {
    Module1.Current.EditBoxDirectApproach = this;
    this.Text = DateTime.Now.ToString("G", CultureInfo.CurrentCulture);
  }
}