0

我正在编写一个 for 循环,该循环显示带有一些 chartfx 显示的链接列表。chartfx 需要一个 sqlDataSource。每次 for 循环进行一次迭代时,我都尝试提供唯一 ID,但我无法将值或函数传递给它。我的代码中的示例如下。getSQLID() 只是一个函数,它返回一个我想成为我的 ID 的字符串。这一切都在 aspx 页面上完成,函数在 .cs 中。任何帮助将不胜感激,谢谢。

     //name of the contentplace holder on the aspx page
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server" >

    //code behind
    Control ctrl = LoadControl("WebUserControl.ascx");
    Control placeHolderControl = this.FindControl("Content2");
    Control placeHolderControl2 = this.FindControl("ContentPlaceHolder1");

    ctrl.ID = "something";
    if (placeHolderControl != null)
        placeHolderControl.Controls.Add(ctrl);
    if (placeHolderControl2 != null)
        placeHolderControl2.Controls.Add(ctrl);
4

1 回答 1

1

首先,回想一下,像这样在设计器中声明的服务器控件在编译时附加到您的类。因此,在运行时尝试在循环中创建多个实例是没有意义的,这就是为什么在编译时必须知道例如 Id 标记中的值的原因。

一种替代方法是在后面的代码中创建它们,例如:

for (int i=0; i<2; ++i)
{
    var chart = new Chart();
    chart.Id = "chartId" + i;
    chart.DataSourceId = "srcid" + i;

    var src = new SqlDataSource();
    src.Id = "srcid" + i;

    Controls.Add(chart); // either add to the collection or add as a child of a placeholder
    Controls.Add(src);
}

在您的情况下,将所有这些声明性属性转换为后面的代码可能需要一些工作(尽管这是可能的)。另一种方法是制作一个用户控件 (ascx),其中包含现在在您的 aspx 页面中的标记。您可以使用以下代码实例化代码中的控件:

for (int i=0; i<2; ++i)
{
    var ctrl = LoadControl("~/path/to/Control.ascx");
    ctrl.Id = "something_" + i;
    Controls.Add(ctrl); // again, either here or as a child of another control
    // make the src, hook them up
}
于 2013-03-27T15:53:09.640 回答