Как обновить привязку к источнику данных WindowsForms.TextBox.DataSource .. mmm .. при каждом событии TextChanged (во время ввода)? - PullRequest
1 голос
/ 23 ноября 2010

Как обновить привязку к источнику данных WindowsForms.TextBox.DataSource .. mmm .. для каждого события TextChanged (во время ввода)?

Это полезно, если вы хотите обновить некоторые "счетчики" или "статусы ошибок" при вводе.

Иногда я использовал этот код, но он выглядит слишком сложным. Может быть, есть другое, более простое решение?

class FlashTextBox:TextBox
{
  protected override void OnTextChanged(EventArgs e)
  {
   Binding binding = this.DataBindings["Text"];
   if (binding!=null)
   {
    PropertyManager propertyManager = 
                                binding.BindingManagerBase as PropertyManager;
    if (propertyManager!=null)
    {
               PropertyInfo pinfo =      
                                    binding.DataSource.GetType()
                                    .GetProperty(binding.BindingMemberInfo.BindingField,
                                    BindingFlags.Instance | BindingFlags.Public);
     pinfo.SetValue(binding.DataSource, this.Text, null);
    } 
   }
                    if (isAutoScrollVisible)
                    {
                            ChangeScrollVisibility();
                    }
   base.OnTextChanged (e);
  }

  const int WM_KEYDOWN = 0x0100;
  public override bool PreProcessMessage(ref System.Windows.Forms.Message msg)
  {
   if(msg.Msg == WM_KEYDOWN)
   {
    switch((Int32)msg.WParam)
    {
     case (int)Keys.Enter :
      if (EnterPressed!=null)
       EnterPressed(this,EventArgs.Empty);
      break;
    }
   } 
   return base.PreProcessMessage(ref msg);
  }
}

1 Ответ

3 голосов
/ 23 ноября 2010

Следующий фрагмент кода показывает, как можно связать свойство TextBox.Text со свойством PropertyName бизнес-объекта. Убедитесь, что вы установили параметр DataSourceUpdateMode.OnPropertyChanged как DataSourceUpdateMode.OnValidation по умолчанию для элементов управления TextBox.

var bindingSource = new System.Windows.Forms.BindingSource();
bindingSource.DataSource = businessObject;
flashTextBox.DataBindings.Add(new System.Windows.Forms.Binding(
    "Text", 
    bindingSource, 
    "PropertyName", 
    true, 
    System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged
    ));

Подробнее см. В документации MSDN: http://msdn.microsoft.com/en-us/library/system.windows.forms.binding.aspx

...