FineUI 官方论坛

标题: [急] 自定义回发如何为动态控件赋值? [打印本页]

作者: 凤舞天翔    时间: 2012-3-9 12:05
标题: [急] 自定义回发如何为动态控件赋值?
本帖最后由 凤舞天翔 于 2012-3-9 16:59 编辑

就官方示例“自定义回发”为蓝本,增加一个代码生成的控件textbox,如何为它赋值?
代码如下:
custom_postback.aspx文件没有变化。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <ext: PageManager ID="PageManager1" runat="server" />
    <ext:SimpleForm ID="SimpleForm1" runat="server" Width="600px" BodyPadding="5px" EnableBackgroundColor="true"
        Title="简单表单">
        <Items>
            <ext:TextBox ID="TextBox1" runat="server" ShowLabel="false" EmptyText="输入一些文字并按 ENTER 键">
            </ext:TextBox>
            <ext:TextBox ID="TextBox2" runat="server" ShowLabel="false">
            </ext:TextBox>
        </Items>
    </ext:SimpleForm>
    </form>
    <script type="text/javascript">
        function onReady() {
            var textbox1ID = '<%= TextBox1.ClientID %>';
            var textbox1 = Ext.getCmp(textbox1ID);
            textbox1.on("specialkey", function (box, e) {
                if (e.getKey() == e.ENTER) {
                    __doPostBack(textbox1ID, 'specialkey');
                }
            });
        }
    </script>
</body>
</html>

custom_postback.aspx.cx 增加了一个代码生成的控件textbox,在自定义回发中,对它赋值:
protected void Page_Load(object sender, EventArgs e)
        {
            ExtAspNet.TextBox tb = new ExtAspNet.TextBox();
            tb.ID = "TextBox3";
            tb.EmptyText = "代码动态创建的控件";
            SimpleForm1.Items.Add(tb);

            if (!IsPostBack)
            {
            }
            else
            {
                if (Request.Form["__EVENTTARGET"] == TextBox1.ClientID && Request.Form["__EVENTARGUMENT"] == "specialkey")
                {
                    TextBox2.Text = TextBox1.Text;
                    TextBox2.Focus(true);

                    ExtAspNet.TextBox tt = SimpleForm1.FindControl("TextBox3") as ExtAspNet.TextBox;
                    tt.Text = TextBox1.Text;
                }
            }
        }

页面上定义的控件可以得到值,但代码生成的控件(红色部分)得不到值,该如何解决? 请教同仁们。



作者: dennis    时间: 2012-3-9 20:30
这段后台代码有问题,把动态生成控件放在了!IsPostBack外面,会导致执行多次。后面再找控件时,会不会因为重复创建的原因找到的,不是你看到的那个控件呢?
个人猜想,未验证。{:soso_e124:}
作者: 凤舞天翔    时间: 2012-3-9 23:37
标题: RE:
本帖最后由 凤舞天翔 于 2012-3-9 23:38 编辑
dennis 发表于 2012-3-9 20:30
这段后台代码有问题,把动态生成控件放在了!IsPostBack外面,会导致执行多次。后面再找控件时,会不会因为 ...

我也反复测试过,动态代码须放在!ispostback的外面,才能find到控件。
如果页面放一个按钮,把赋值语句放到按钮点击事件里,就可以。
但我现在需要:自定义回发直接赋值给动态控件。我就不知道怎么办了?
还望赐教啊。
作者: 30372245    时间: 2012-3-10 12:55
Asp.Net的 动态添加控件一般用于初始化,并且一般放在Page_Init中。如果想在回发事件中显示隐藏控件,可以使用控件的Hidden属性。
作者: 30372245    时间: 2012-3-10 12:57
30372245 发表于 2012-3-10 12:55
Asp.Net的 动态添加控件一般用于初始化,并且一般放在Page_Init中。如果想在回发事件中显示隐藏控件,可以 ...

这也是Asp.Net的渲染机制决定的,每次回发页面都会重新渲染一遍,这也是为什么要在Page_Load中通过!IsPostBack逻辑判断的原因
作者: 凤舞天翔    时间: 2012-3-11 14:29
本帖最后由 凤舞天翔 于 2012-3-11 14:32 编辑

谢谢答复!~我之前也从生命周期考虑过。我把赋值语句放到了Page_LoadComplete里,可行。
不知道还有其他什么更好的方法?

另外还有个疑问(无意中发觉的),就是用一楼的代码,只是在控件动态创建时,给控件的Enabled属性设为false,结果就可以得到值了。
tb.Enabled = false; 只需这一句代码。

能否告知原由。





欢迎光临 FineUI 官方论坛 (https://fineui.com/bbs/) Powered by Discuz! X3.4