powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / FormView и Сustom Сontrol
4 сообщений из 4, страница 1 из 1
FormView и Сustom Сontrol
    #33897045
Аноним
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток!

Создал контрол предназначенный для упрощения рутиного форматирования. По сути, он помещает контент в 2 вложенных DIVа (<div><div>..контент..</div></div>). При использовать его в FormView есть сложности. При первом заходе на страницу данные отображаются без проблем. Но при вызове updatе ObjectDataSource не межет иизвлечь данные из TextBoxа, вложенного в этот контрол. В итоге получею сообщени об ошибке : "Value cannot be null. Parameter name: Name".

ASP — код:


  <asp:FormView runat="server" DataKeyNames="Id" ...>
    ....

    <EditItemTemplate>

      <ui:TestControl runat="server" ID="tc1">
        <ETag>
          <asp:TextBox ID="NameTextBox" runat="server" Text='<%# Bind("Name") %>' />
        </ETag>
      </ui:TestControl>

    <EditItemTemplate>

  </asp:FormView>

Код контрола:


namespace UI
{
  [ToolboxItem(true)]
  [ParseChildren(true)]
  [ConstructorNeedsTag(false)]
  public class TestControl : HtmlGenericControl 
  {
    private EmbeddedTag _embeddedTag;

    [PersistenceMode(PersistenceMode.InnerProperty)]
    public EmbeddedTag ETag
    {
      get
      {
        this.EnsureChildControls();
        return _embeddedTag;
      }
    }

    protected override void CreateChildControls()
    {
      base.CreateChildControls();

      _embeddedTag = new EmbeddedTag();
      this.Controls.Add(_embeddedTag);
    }

    public TestControl() : base("div")
    {
      this.Style.Add("border", "1px solid blue");
    }
  }

  [ToolboxItem(false)]
  [ParseChildren(false)]
  [ConstructorNeedsTag(false)]
  public class EmbeddedTag : HtmlGenericControl
  {
    public EmbeddedTag()
      : base("div")
    {
      this.Style.Add("border", "1px solid red");
    }
  }
}


При этом следующий код работает без проблем, хотя, по моему мнению, это та же сруктура контролов:


  <asp:FormView runat="server" DataKeyNames="Id" ...>
    <EditItemTemplate>
      <div runat="server" style="...">
        <div runat="server" style="...">
          <asp:TextBox ID="NameTextBox" runat="server" Text='<%# Bind("Name") %>' />
        </div>
      </div>
    <EditItemTemplate>
  </asp:FormView>

Посоветуйте, как решить эту проблему, а то у меня все варианты кончились :maniac:.
...
Рейтинг: 0 / 0
FormView и Сustom Сontrol
    #33897295
RustM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, <Аноним>, Вы писали:

А>Доброго времени суток!

А>Создал контрол предназначенный для упрощения рутиного форматирования. По сути, он помещает контент в 2 вложенных DIVа (<div><div>..контент..</div></div>). При использовать его в FormView есть сложности. При первом заходе на страницу данные отображаются без проблем. Но при вызове updatе ObjectDataSource не межет иизвлечь данные из TextBoxа, вложенного в этот контрол. В итоге получею сообщени об ошибке : "Value cannot be null. Parameter name: Name".

Реализуй System.Web.UI.IStateManager... << RSDN@Home 1.2.0 alpha rev. 655>>
...
Рейтинг: 0 / 0
FormView и Сustom Сontrol
    #33897795
Аноним
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте, RustM, Вы писали:

RM>Реализуй System.Web.UI.IStateManager

И как это должно помочь? Я же наследуюсь от HtmlGenericControl и механизм работы ViewState в нем реализован (от HtmlContainerControl). Кроме того, если всеже вставить приведенный ниже код и пробежаться по нем debugeром, то оказывается, что ни один метод данного интерфейса не вызывается.


    #region IStateManager Members

    bool IStateManager.IsTrackingViewState
    {
      get
      {
        return base.IsTrackingViewState;
      }
    }

    void IStateManager.LoadViewState(object state)
    {
      base.LoadViewState(state);
    }

    object IStateManager.SaveViewState()
    {
      return base.SaveViewState();
    }

    void IStateManager.TrackViewState()
    {
      base.TrackViewState();
    }

    #endregion
...
Рейтинг: 0 / 0
FormView и Сustom Сontrol
    #33898390
RustM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, RustM, Вы писали:

HtmlGenericControl уже реализует интерфейс как ты сам сказал, поэтому тебе нужно лишь просто переопределить соответствующие методы и дополнить чуточку. Думаю легче показать, чем объяснять. Где-то так.


...
protected override void LoadViewState(object savedState)
{
    Pair pair = (Pair)savedState;

    if (savedState == null)
    {
        base.LoadViewState(savedState);
    }
    else
    {
        base.LoadViewState(pair.First);

        if (pair.Second != null)
             ((IStateManager)ETag).LoadViewState(pair.Second);
    }
}

protected override object SaveViewState()
{
    Pair pair  = new Pair();            
    pair.First = base.SaveViewState();

    if (_embeddedTag != null)
         pair.Second = ((IStateManager)_embeddedTag).SaveViewState();

    if (pair.First != null && pair.Second != null)
        return pair;

    return null;
}

protected override void TrackViewState()
{
    base.TrackViewState();
    
    if (_embeddedTag != null)
         ((IStateManager)_embeddedTag).TrackViewState();
}
...

Ключевые моменты я выделил.

И потом подружись с MSDN и поиском :)... << RSDN@Home 1.2.0 alpha rev. 655>>
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / FormView и Сustom Сontrol
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]