0

好的,所以我的 ASP 页面上有一个表格,如下所示:

<asp:Table ID="attachedFiles" runat="server" BorderColor="LightGray" BorderWidth="1" ViewStateMode="Enabled"> 
    <asp:TableRow ID = "attachedFilesRow" runat="server">
        <asp:TableCell ID="exampleCell" runat="server" Visible="false" >
            <asp:Label runat="server" Text="" />
            <asp:ImageButton runat="server" ImageAlign="Middle" ImageUrl="~/images/kill.png" OnClick="removeAttachment" />
        </asp:TableCell>
    </asp:TableRow>
</asp:Table>

我在此处创建的示例单元格不可见,因为我仅将其用作将在后面的代码中添加的其他单元格的模板:

TableCell cell = new TableCell();
TableRow row = new TableRow(); 

cell = exampleCell;
row = attachedFilesRow;

((Label)cell.Controls[0]).Text = fileName;
cell.Visible = true;
row.Cells.Add(cell);
attachedFilesRow = row;
attachedFilesRow.DataBind();

后面代码中的代码在 ASP 页面上的按钮的 onClick 方法中。这个想法是,如果用户想要添加附件,他们单击“添加附件”,然后将一个单元格添加到已经存在的表格中。该单元格应该看起来像这样 [filenName.txt X],其中 X 是一个 ImageButton,以便用户可以单击它并删除附件。

我的问题是每次用户添加附件时,以前的 TableCell 都会被新的 TableCell 替换,而不是添加到 TableRow 中。我想这可能是因为我正在创建一个 TableCell 然后将它设置为等于一个已经存在的表格单元格实例所以我尝试了这个:

ASP:

<asp:Table ID="attachedFiles" runat="server" BorderColor="LightGray" BorderWidth="1" ViewStateMode="Enabled"> 
    <asp:TableRow ID = "attachedFilesRow" runat="server">
    </asp:TableRow>
</asp:Table>

代码背后:

TableCell cell = new TableCell();

ImageButton button = new ImageButton();
button.ImageUrl = "~/images/kill.png";
button.Attributes.Add("onclick", "removeAttachment");

Label label = new Label();
label.Text = fileName;

cell.Controls.Add(button);
cell.Controls.Add(label);

attachedFilesRow.Cells.Add(cell); 

我也尝试了两种方法来添加 attachFilesRow.DataBind(); 到最后,并尝试了这两种方法来实例化新的行和单元格对象,而不是直接使用 ASP 页面中的现有对象。这些东西似乎都没有起到太大的作用。

tl; dr每次我在 buttonClick 上将 TableCell 添加到现有表格时,它都会替换我表格中的另一个单元格,而不是添加到其中。

编辑:

我不一定要添加新行...这就是我想要的:

用户添加一个附件后:[fileName.txt X]

后两个:[fileName.txt X] [fileName2.txt X]

三后:[fileName.txt X][fileName2.txt X][fileName3.txt X]

它基本上是一个行表,如果有意义的话,可以添加列或单元格。

4

1 回答 1

1

您不是“替换”前一个单元格。在每次回发时,ASP.NET 页面生命周期启动,您将获得一个新的页面实例。这是因为 Web 是无状态的,尽管 ASP.NET 给人的印象是状态,但实际上并不存在。

所以,发生的事情是你每次都是从头开始,你总是在你的行中创建一个单元格。您需要做的是保留您添加的所有项目的列表,然后每次都呈现它们(通过数据绑定或代码)。

此示例应该完全符合您的要求:

namespace WebApplication1
{
    using System;
    using System.Collections.Generic;
    using System.Web.UI.WebControls;

    public partial class _Default : System.Web.UI.Page
    {
        private const string UploadViewState = "UploadViewState";

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                // initialise list and store in ViewState
                ViewState[UploadViewState] = new List<string>();
            }
        }

        protected void btnAdd_Click(object sender, EventArgs e)
        {
            // Get the list from ViewState and add the new item
            var _filesToUpload = (List<string>)ViewState[UploadViewState];
            _filesToUpload.Add(text1.Text);

            // Now recreate the row adding cells for each file...
            foreach (string item in _filesToUpload)
            {
                TableCell cell = new TableCell();
                ImageButton button = new ImageButton();
                button.ImageUrl = "~/images/kill.png";
                button.Attributes.Add("onclick", "removeAttachment");
                Label label = new Label();
                label.Text = item;
                cell.Controls.Add(button);
                cell.Controls.Add(label);
                attachedFilesRow.Cells.Add(cell);
            }
        }
    }
}

除了我的代码示例之外,您还可以在文件上使用数据绑定List<...>,但我只是按照您的代码进行操作。秘诀是使用一个List<...>项目并将其存储在 ViewState 中,从那时起,其他一切都应该很简单。

于 2012-12-12T15:53:56.427 回答