【问题标题】:ASP.NET WebControl & Page - Adding controls (like TextBox) dynamicallyASP.NET WebControl & Page - 动态添加控件(如 TextBox)
【发布时间】:2010-11-04 23:03:43
【问题描述】:

我正在尝试使用文本框创建自定义服务器控件 (WebControl)。

我将 asp.net 文本框添加到 CreateChildControls 覆盖中的自定义控件。在 OnInit 覆盖中,我将事件处理程序添加到 TextBox.TextChanged。

一切正常,除了 TextChanged 永远不会触发。我查看了视图状态,看起来我的文本框从未将其 Text 属性保存在视图状态中。我尝试在各个地方设置 Text,包括构造函数,但没有任何效果。

如何将 TextBox 动态添加到 WebControl 以将其 Text 保存在 viewstate 中并触发 TextChanged 事件?

我非常感谢后面的 WebControl 代码示例,其中 TextBox 被动态添加并被触发 TextChanged 事件。

【问题讨论】:

    标签: asp.net dynamic-controls web-controls


    【解决方案1】:

    This 会帮助你。简而言之,您需要自己处理动态添加的控件的视图状态。

    【讨论】:

      【解决方案2】:

      必须在每次回发时再次创建动态创建的控件(pageInit 事件是更好的选择)才能触发该事件。

      顺便说一句,如果您希望 TextChanged 事件生成回发,您还必须将控件的 AutoPostback 设置为 true。

      【讨论】:

      • 它需要创建,但视图状态也需要恢复。如果您不手动处理视图状态,页面会将其视为新控件,并且不会正确触发任何事件。
      • rie819,抱歉,我已经使用了很多时间动态创建的控件,并且从不需要特别注意视图状态,这与数据绑定有关吗?
      • 您能否提供一个页面代码示例,说明您可以在其中运行 TextChange 事件?
      • 我不想要自动回发。当用户单击单独的按钮时会发生回发。
      【解决方案3】:

      修复它。必须在 Init 事件中创建和添加动态控件。必须为其分配一个没有特殊 ASP.NET 符号的 ID(自定义 ID 中的“$”或“:”会破坏事物)。控件添加到控件树后,必须分配所有属性。

      这是页面代码隐藏的工作示例:

      private readonly TextBox _textBoxTest = new TextBox();
      
      protected void Page_Init( object sender, EventArgs e )
      {
          this.form1.Controls.Add( _textBoxTest ); 
          _textBoxTest.Text = "TestBoxTest";
          _textBoxTest.ID = "TestBoxTestId";
          _textBoxTest.TextChanged += this._textBoxTest_TextChanged;
      }
      
      void _textBoxTest_TextChanged( object sender, EventArgs e )
      {
          _textBoxTest.Text = "Worked";
      }
      

      对于 WebControl 将初始化代码放在 OnInit 覆盖中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-11
        • 1970-01-01
        • 2018-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        相关资源
        最近更新 更多