Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET中继器中动态创建具有唯一ID的控件_C#_Asp.net_Asp.net 4.0 - Fatal编程技术网

C# 在ASP.NET中继器中动态创建具有唯一ID的控件

C# 在ASP.NET中继器中动态创建具有唯一ID的控件,c#,asp.net,asp.net-4.0,C#,Asp.net,Asp.net 4.0,我有一个文件列表(存储在数据库中),我希望用户能够在异步回调中上载这些文件 我已经在我期望的每个文件的名称旁边显示了AJAX控件工具包的控件: <asp:Repeater ID="SourceTables" runat="server"> <ItemTemplate> <tr> <td> <%#DataBinder.Eval(Container.DataItem,

我有一个文件列表(存储在数据库中),我希望用户能够在异步回调中上载这些文件

我已经在我期望的每个文件的名称旁边显示了AJAX控件工具包的控件:

<asp:Repeater ID="SourceTables" runat="server">
    <ItemTemplate>
        <tr>
            <td>
                <%#DataBinder.Eval(Container.DataItem, "LongName")%>
            </td>
            <td>
                <ajax:AsyncFileUpload runat="server" ClientIDMode="AutoID" />
            </td>
        </tr>
    </ItemTemplate>
</asp:Repeater>

所有这些异步上载控件最终都会在代码隐藏中调用相同的方法,这很好,但当我来保存文件时,我需要某种方法来确定是哪个控件导致了回发(即,几个文件中的哪个刚刚上载)。但是,我无法在中继器内动态设置ID(我相信这只能从代码隐藏中实现)

显然,这是行不通的:

<ajax:AsyncFileUpload ID=<%#DataBinder.Eval(Container.DataItem, "ShortName")%> runat="server" ClientIDMode="AutoID" />


是否有其他方法可以在中继器内动态设置每个上载控件的ID(或其他方法),或者可以采取其他方法?

您不能绑定控件的
ID
属性。您需要在代码隐藏中创建控件并将其添加到中继器

例如:

protected void GridDataBind(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow) {
        IEnumerable list = PremiumUnitFees.PremiumAmenities.ObtainFeesForProject(IntranetUser.Current.ProjectId);
        foreach (PremiumUnitFees.PremiumAmenities feature in list) {
            e.Row.Cells(3).Controls.Add(new CheckBox {
                ID = feature.Id.ToString(),
                Text = feature.NickName,
                Checked = PremiumUnitFees.PremiumUnitView.IsUnitPremium(feature.Id, Convert.ToInt64(DataBinder.Eval(e.Row.DataItem, "Id")))
            });
        }
    }
}

您如何处理回发事件

如果正在使用AsyncFileUpload控件的UploadedComplete事件,则可以通过AsyncFileUploadeEventArgs对象获取上载的文件

您还可以将sender强制转换为AsyncFileUpload控件,然后通过PostedFile属性获取文件

 protected void AsyncFileUpload1_UploadedComplete(object sender, AsyncFileUploadEventArgs e)
 {
     string savePath = MapPath("~/Uploads/" + Path.GetFileName(e.filename));
 }
像这样的

  <ajax:AsyncFileUpload runat="server" id="afuMyUpload" ClientIDMode="AutoID" OnClientUploadComplete="MyFunction" />



   foreach (Control c in SourceTables.Items)
   {
        var myUpload = c.FindControl("afuMyUpload") as AsyncFileUpload;
        //Do stuff with your control
   }

foreach(SourceTables.Items中的控件c)
{
var myUpload=c.FindControl(“afuMyUpload”)作为AsyncFileUpload;
//用你的控制力做事
}

您可以在中继器的“ItemDatabound”事件中动态添加控件。

那么,在代码中设置控件是一个选项吗?我不知道在中继器中添加控件时如何操作。很抱歉这个愚蠢的问题,但是如何在代码隐藏中创建控件并将其添加到中继器?我找不到任何例子。@克里斯,我将更新我的答案。这是非常基本的,因为我在火车上通过电话回答你,对不起。谢谢-是的,这正是我正在做的。但是我不想使用相同的文件名保存(我不信任传入的文件名),所以我想确定哪个控件正在进行回发,并(基于此)使用特定的文件名保存等。好的-传递给事件处理程序的发送方对象实际上是AsyncFileUpload控件。因此,你应该能够铸造它,并使用它,无论你喜欢。在类似的情况下,我一直使用guid作为文件名保存文件,但文件扩展名与传入的文件名相同。您也可以使用sender控件的父属性沿控件树向上遍历,要访问您在数据绑定中使用的DataItem,我已经通过使用父属性遍历实现了我想要的功能-非常感谢您的想法。不过我觉得我做得不好——我能用这种方法得到的唯一有用的属性是ItemIndex。鉴于此,再次执行DB查询以获取中继器绑定到的数组,我可以计算中继器项中的内容。但是,正如您所说,是否有任何方法可以通过父属性访问带有绑定数据的DataItem?如果这还不清楚,我会更详细地重写。再次非常感谢Thomas。我有没有办法将ID设置为创建它们的中继器的DataItem属性?@Chris你是指服务器ID还是客户端ID?在中继器中设置ServerId实际上没有什么作用,因为您无法直接访问它们。你仍然需要像上面那样查看它们。是的,这绝对是最好/最简单的方法。谢谢Sreekanth。