c# - ASP.NET:在回发不同数据后动态添加控件

标签 c# asp.net

我有一个页面,管理员可以在其中编辑我从 flickr 中提取的一些照片,因此所有控件都是动态添加的。

我将几个控件添加到面板,然后将面板添加到 Form.Controls。 他们持有的所有数据都来自 flickr。

我的问题是,在回发列表更改和控件正在加载之后,即使我每次都从 flickr 获取数据,但文本框在回发之前会保留相同的数据。

如果我用更少的文本框执行此操作,一切都会正常进行,这对我来说有什么奇怪的。 该列表大约有 10 多张图片,这个数字将来可能会发生变化。

(抱歉我对编程很陌生,代码很乱) 这是代码:

protected void Page_Load(object sender, EventArgs e)
    {

        if (!Page.IsPostBack)
        {
            RadioButtonList1.AutoPostBack = true;

            selectedSetID = getSelectedSetId(RadioButtonList1.SelectedItem.Text);

            photoSet = new MyPhotoSet(selectedSetID);
            photo = new FlickerImages[photoSet.Count];

            for (int j = 0; j < photo.Length; j++)
            {
                photo[j] = new FlickerImages(photoSet.MediumURLS[j], photoSet.ThumbnailURLS[j],                                 photoSet.Titles[j], photoSet.Descreption[j], photoSet.PhotosID[j]);

                panel = photo[j].GetPanelWithEditControls(j);

                button = new Button();
                button.ID = "sendDataButton" + j;
                button.Text = "send data";
                button.Click += button_Click;

                panel.Controls.Add(button);
                Form.Controls.Add(panel);
            }

        }
        else
        {
                 //here is the post back,
 every thing load fine.
 adding and removing the controls but if the textbox's load in the same place, it hold the same data befor the post back.

            RadioButtonList1.AutoPostBack = true;
            selectedSetID = getSelectedSetId(RadioButtonList1.SelectedItem.Text);

            photoSet = new MyPhotoSet(selectedSetID);
            photo = new FlickerImages[photoSet.Count];

            for (int i = 0; i < photo.Length; i++)
            {
                photo[i] = new FlickerImages(photoSet.MediumURLS[i], photoSet.ThumbnailURLS[i],                                     photoSet.Titles[i], photoSet.Descreption[i], photoSet.PhotosID[i]);

                panel = photo[i].GetPanelWithEditControls(i);

                button = new Button();
                button.ID = "sendDataButton" + i;
                button.Text = "send data";
                button.Click += button_Click;

                panel.Controls.Add(button);
                Form.Controls.Add(panel);
            }

        }
    }

(对不起我的英语)

最佳答案

不要将控件生成放在 Page_Load 中,而是放在 Page_Init 中。

既然您提到您是 ASP.NET 的新手,我强烈建议您阅读 Page Lifecycle .

作为 ASP.NET 开发人员,了解从服务器收到对 aspx 页面的请求到页面输出以呈现的时间之间服务器上发生某些事情的方式和时间非常重要浏览器。

为什么我建议将代码放在 Page_Init 中的简短解释是运行时如何处理动态创建的控件和 Viewstate。 Viewstate 包含您的网络应用程序的用户所做的任何更改。在页面生命周期中,您会注意到 Viewstate 值的应用发生在 Page_Load 之前,但在 Page_Init 之后。

这意味着如果您的代码位于 Page_Load 中,则控件是从 Viewstate 生成的,并根据用户输入的内容进行更新,但是您自己在 page_Load 中的代码会使用默认值重新生成这些控件。此事件后不会发生任何可以重新加载用户输入的事情。

(希望这是有道理的。如果没有,我链接到的页面可能会更好地解释它。)

here 上还有另一篇文章从不同的角度解决了该主题,但对您仍然很有帮助。

还有超短版here .

最后,(最好的留到最后)可以找到关于该主题的最全面的文章之一,它用通俗易懂的英语解释了事情 here .

关于c# - ASP.NET:在回发不同数据后动态添加控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9880299/

相关文章:

c# - 在 C# 中加载 C++ dll 时,CLR 是否自动加载 C++ 文件的依赖项?

c# - 自定义文本框控件

c# - 使用 iTextSharp 将 HTML 转换为 PDF 不支持阿拉伯语

javascript - 从后面的代码调用 javascript

c# - 不能对数据列表中的 CheckBoxList 使用 RequiredFieldValidator

asp.net - 如何在工作流程的不同 git 分支中保留不同版本的 WSDL

c# - 在 asp.net mvc 中发送电子邮件而不像在 php 中那样使用凭据

c# - 除非在引号 C# 中,否则按字符分隔字符串

c# - 如果长度为 6 个字符,如何在文本框中的第 3 个字符后添加空格,如果长度为 7 个字符,如何在第 4 个字符后添加空格

c# - 使用 LINQ 更新记录