Проблема с контрольным значением при загрузке формы - PullRequest
0 голосов
/ 09 марта 2011

как кофе для бессонницы, у меня есть еще один вопрос для публикации.

в событии загрузки формы, я создаю и инициализирую элементы управления на основе атрибутов класса, переданного в качестве аргумента в конструктор формы.выпадающие списки и флажки рано (метод "initializeControls ()") завершаются неудачно при создании формы, но не позднее (метод resetData () ").я не понимаю, как оба они вызываются во время события "SomeForm_Load (sender, e)".я сделал что-то основное, как использовать неправильное событие?как говорилось в моих предыдущих постах с вопросами, я новичок в c #.Любое руководство приветствуется.не стесняйтесь сказать мне, если я использую слишком много отражения тоже: D.

псевдокод, для сути моей проблемы:

public class SomeForm : Form
{
  #region fields
  private int _id { get; set; }
  private int _id2 { get; set; }
  #endregion fields
  ...
  public SomeForm()
  {
    InitializeComponent();
  }
  public SomeForm(int id, int id2) : this()
  {
    _id = id;
    _id2 = id2;
  }

  #region init
  private void SomeForm_Load(object sender, EventArgs e)
  {
    method1(); // fails
    method2(); // works
  }
  private void method1()
  {
    var ds = new []{1,2};
    CheckBox cb = new CheckBox();
    cb.DataSource = ds;
    cb.SelectedValue = _id; // <== this is the problem. these two
    this.Controls.Add(cb);  // <== steps should be switched.
  }
  private void method2()
  {
    cb.SelectedValue = _id2;
  }
  ...
}

реальный код:

public class SomeForm : Form
{
  ...
  #region fields
  ...
  private MultiState.Update _child { get; set; }
  protected object data { get; set; }
  private Type _masterType { get; set; }
  private List<PropertyInfo> _mpks = new List<PropertyInfo>();
  private User _user { get; set; }
  #endregion fields
  ...
  public SomeForm()
  {
    InitializeComponent();
  }
  public SomeForm(User user, Type amaster, object aobject, Dictionary<string, object> astate) : this()
  {
    data = aobject;
    _masterType = amaster;
    dataState = astate;
    _user = user;
  }

  #region init
  private void SomeForm_Load(object sender, EventArgs e)
  {
    initialize();
  }
  private void initialize()
  {
    tsData.Visible = false;
    if (data != null)
    {
      initializeControls(); // FAILS!! without exception
      dataId = DataService.GetPrimaryKeyValue(data);
      resetData(); // SUCCEEDS
    }
  }
  private void initializeControls()
  {
    ...
    ComboBox cb = new ComboBox();
    cb.Enabled = fdEnabled; // correctly read from linq datacontext custom attribute
    cb.FormattingEnabled = true;
    cb.Location = new Point(x, y);
    cb.Name = _CP_COMBOBOX + pi.Name;
    cb.Size = new Size(_WIDTH_CODE, _HEIGHT_SINGLE);
    cb.TabIndex = i;
    cb.TabStop = true;
    cb.Leave += new EventHandler(this.ctlEdit_Leave);

    // set drop-down
    cb.DataSource = domain; // correctly populated from service class
    cb.ValueMember = "Id";
    cb.DisplayMember = "Label";

    // set default
    if (fdDefault != null)
    {

ЗАДАНИЕ НИЖЕ НЕ ВЫПОЛНЯЕТСЯ !!желаемое значение вычисляется правильно (без комментария), но оно просто игнорируется без каких-либо исключений.

      //object wth = GetDomainKeyAsIdentifierSafe(domain, fdDefault, _user); // correctly parsed
      cb.SelectedValue = GetDomainKeyAsIdentifierSafe(domain, fdDefault, _user); // HUGE FAIL!!
    }
    ...
  }
  #endregion init
  ...
  #region persistence
  ...
  protected string resetData()
  {
    string rc = "";
    if (!isDataNew()) // this form only modal
    {
      //resetDataState();
      #region bind-object-vs-set
      foreach (Control control in this.Controls)
      {
        try
        {
          if (control.Name.StartsWith(_CP_TEXTBOX))
          {
            MethodInfo mi = data.GetType().GetMethod(DataService.LINQ_GET + control.Name.Substring(_CP_TEXTBOX.Length));
            object value = mi.Invoke(data, null);
            control.Text = value == null ? "" : value.ToString();
          }
          else if (control.Name.StartsWith(_CP_CHECKBOX))
          {
            #region bind-object-vs-set-cbx
            bool ck = false;
            string scontrol = control.Name.Substring(_CP_CHECKBOX.Length);
            MethodInfo mi = data.GetType().GetMethod(DataService.LINQ_GET + scontrol);
            object value = mi.Invoke(data, null);
            if (value != null)
            {
              if (value.GetType() == typeof(bool))
              {
                ck = (bool)value;
              }
              else if (value.GetType() == typeof(Nullable<bool>))
              {
                Nullable<bool> nvalue = (Nullable<bool>)value;
                if (nvalue.HasValue)
                  ck = nvalue.Value;
                else
                  ck = AtsService.GetDefaultBoolean(data.GetType(), scontrol);
              }
            }
            CheckBox cbx = (CheckBox)control;
            cbx.Checked = ck;
            #endregion bind-object-vs-set-cbx
          }
          else if (control.Name.StartsWith(_CP_COMBOBOX))
          {
            MethodInfo mi = data.GetType().GetMethod(DataService.LINQ_GET + control.Name.Substring(_CP_COMBOBOX.Length));
            object value = mi.Invoke(data, null);
            ComboBox cb = (ComboBox)control;

НАЗНАЧЕНИЕ НИЖЕ ТАЙНО РАБОТАЕТ !!

            cb.SelectedValue = value == null ? FormService.NOSELECTION_ID : value; // but this one works!!
          }
        }
      }
    }
  }
  ...
  #endregion persistence
}

edit: добавлено большеФлаги в точках успеха и неудачи.

Ответы [ 3 ]

1 голос
/ 09 марта 2011

ссылка 1 доступность динамического комбинированного списка

источник combobox.datasource недоступен до его отрисовки, то есть после «this.Controls.Add (cb);»

спасибо за очень быструю обратную связь, которая побудила меня найти разрешение.

1 голос
/ 09 марта 2011

Хотя ваша проблема недостаточно ясна, но я думаю, что вы создаете локальные переменные внутри "initialzeControls ()" и ожидаете, что они будут как-то доступны на уровне класса ...

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

0 голосов
/ 09 марта 2011

Немного трудно следовать вашей стене кода, поскольку вы использовали неоднозначные имена и не документировали свой код должным образом.

Я предлагаю вам сузить проблему, установив точки останова и войдя в свой код: F11.

...