C# ASP表行计数未增加
我有一个ASP表格,第一行有一个下拉列表和文本框。我有一个点击按钮,应该添加一个类似的行。我在按钮点击事件中有以下功能C# ASP表行计数未增加,c#,asp.net,dynamic,C#,Asp.net,Dynamic,我有一个ASP表格,第一行有一个下拉列表和文本框。我有一个点击按钮,应该添加一个类似的行。我在按钮点击事件中有以下功能 public void addRow() { int flag = Table1.Rows.Count; DropDownList ddl = new DropDownList(); ddl.ID = "ddl" + (flag + 1).ToString(); TextBox tBox = new TextBox(); tBox.ID
public void addRow()
{
int flag = Table1.Rows.Count;
DropDownList ddl = new DropDownList();
ddl.ID = "ddl" + (flag + 1).ToString();
TextBox tBox = new TextBox();
tBox.ID = "txt" + (flag + 1).ToString();
TableCell tCell1 = new TableCell();
TableCell tCell2 = new TableCell();
tCell1.Controls.Add(ddl);
tCell2.Controls.Add(tBox);
TableRow tRow = new TableRow();
tRow.Cells.Add(tCell1);
tRow.Cells.Add(tCell2);
Table1.Rows.Add(tRow);
}
添加第二行时,此代码工作正常。当我再次单击该按钮时,flag的值(该值应为表的行数)没有增加。因此不会创建新行。你能告诉我为什么flag的值没有增加吗?还是他们的方法更容易做到这一点?直接回答或链接会有帮助
表的标记代码:
<asp:Table ID="Table1" runat="server" Width="410px">
<asp:TableRow>
<asp:TableCell>
<asp:DropDownList runat="server" ID="ddl1"></asp:DropDownList>
</asp:TableCell>
<asp:TableCell>
<asp:TextBox runat="server" ID="txt1"></asp:TextBox>
</asp:TableCell>
</asp:TableRow>
</asp:Table>
这里的问题是,您不了解,更重要的是,您不了解它如何与(您添加的控件)交互 不幸的是,如果不了解这些“动态”创建的控件中的值是用于服务器端还是客户端,我们就无法回答这个问题 我可以猜到: 1) 如果它们用于客户端消费/使用,则说明您做错了。如果你需要更多的信息,问另一个(更具体的)问题 2) 如果它们用于服务器端消费/使用,则每次回发只能允许一条新记录,并且应该包括一个“保存”按钮,该按钮将保存当前的“新”行并导致页面刷新,用户可以向其中添加新条目 3) 请参阅规则#0(每个规则都有例外。{此规则适用于您理解当前问题的情况。})
Monk警告-一大块丑陋的文字 我将试着解释为什么你试图做的事情并不像听起来那么简单(或者像我希望的那样简单),并希望给你一个替代的方法,在 可能不是直截了当的,应该是“更好” 它从较高的层次概述了您尝试执行的操作,如下所示: 在完成保存之前,为用户提供向集合(数据库)添加一条或多条记录的机会 在单击最终保存按钮之前,可以使用回发生成额外的行/项。悬停这可能不是最简单或最好的方法 从技术角度来看,添加动态控件必须以非常特定的方式在系统中的特定点进行处理。动态控件还必须在每次回发时重新创建,因此每次用户单击“添加”按钮时,除了新行之外,还必须重新创建已有的行。这就是为什么在本例中只得到一行。这只是添加了dynamic控件。等到你开始从你的动态文本框和下拉列表中获取数据 从最终用户的角度来看,这种方法也不理想,因为每次用户点击“添加”按钮时,页面都会在请求/响应过程中循环,这在minumun会引起一些不愉快的闪现 更新 但是怎么做呢?我听到你问。好的,这里是(对于这个例子,我将其简化为一列): ASPX
<asp:Table ID="Table1" runat="server">
<asp:TableRow>
<asp:TableCell><asp:TextBox ID="txt1" runat="server"> </asp:TextBox></asp:TableCell>
</asp:TableRow>
</asp:Table>
<asp:Button ID="btnAdd" runat="server" Text="Add" onclick="Button1_Click" />
<asp:HiddenField ID="hdnRowCount" runat="server" />
<asp:Button ID="btnSave" runat="server" onclick="btnSave_Click" Text="Save" />
<div>
<asp:Label ID="lblResult" runat="server" Visible="false"></asp:Label>
</div>
创建第一行的克隆。然后,在将新行追加到表之前,需要调整表单字段的id
和name
属性。您还需要一个隐藏表单字段来跟踪隐藏行的数量。当用户最终点击“保存”按钮时,在C#侧,从隐藏字段中获取附加行数,然后使用Request.Form[]
获取每个添加字段的值
在我看来,这将是最终用户更流畅的体验
另一个有点粗糙的选项,如果您定义了额外行的最大数量。为此,在表中有mamimum行和表单控件。然后,您可以在aspx中使用visible=“false”
,并在用户单击“添加”时使用post back将其更改为visible=“true”
。另一个选项是为行提供一个CSS类来隐藏该行,然后使用javascript/jquery删除该类以使该行可见。@TJMonk15“你根本不明白发生了什么”,这不是OP在这里寻求帮助的原因吗?@JonP尽管这是他们在这里的原因,这也是为什么我们总是要回答令人难以置信的基本问题。这是因为我对编程、OOP或(可能更重要的是)他们使用的系统缺乏非常基本的了解。@TJMonk15我使用ASP.NET已经有一段时间了,我不明白它为什么要这样做,尽管我可能需要更多的细节,例如表是如何创建的。这个问题与基本编程关系不大,可能与ASP.NET页面生命周期关系更大,这不是一件容易理解的小事。如果你知道问题是什么,那么请发布一个答案。否则,你的评论会让人觉得你是居高临下,毫无帮助的。@Partha,你能提供表格是如何在.aspx页面中创建的,以及从哪里调用的addRow
?按钮点击事件?页面加载?在Init上,我只是拖放了一个表,并在source中添加了第一行。在按钮单击事件中调用此函数。如果是琐碎的话,我很抱歉。非常感谢您详细的回答,先生!!。我还按照您的建议开始了jQuery的工作。我突然得到了一个要求,如果用户愿意,我需要动态删除一行。为此,我创建了一个[Serializable]类,其中dgv的所有列都是其成员。在page类中,创建了该类的列表并对其执行了操作。我将该列表存储为ViewState,并将其用作gridview的数据源。它似乎也很好用。再次感谢您的帮助!!!
private int rowCount = 1;
private bool rowNeeded = false;
protected override void OnPreInit(EventArgs e)
{
//Pre-emptively create additional row on post back.
//We'll remove it if we don't need it later
//Controls Have to be added at pre-init to maintain their view state
//Adding a row in the button click event will result in any data
//entered in that row dissapearing from viewstate on next post back
if (IsPostBack)
{
//Get number of additional rows from hidden field
//We're using a hidden form field and Request.Form
//instead of ViewsState and hdnRowCount.value
//because ViewState has not been loaded at this stage
//of the page life cycle
if (!string.IsNullOrEmpty(Request.Form["hdnRowCount"]))
{
rowCount = int.Parse(Request.Form["hdnRowCount"]);
}
for (int i = 0; i < rowCount; i++)
{
TableRow tr = new TableRow();
TableCell tc = new TableCell();
TextBox tb = new TextBox();
// +2 as there are existing controls with "1", eg txt1
tb.ID = string.Format("txt{0}",i+2);
tc.Controls.Add(tb);
tr.Cells.Add(tc);
Table1.Rows.Add(tr);
}
}
base.OnPreInit(e);
}
//Add Row Click
protected void Button1_Click(object sender, EventArgs e)
{
//Hold number of additional rows in hidne field
hdnRowCount.Value = (++rowCount).ToString();
//Let the page know we need to keep the row
rowNeeded = true;
}
//An Exmple of how to get your data out
protected void btnSave_Click(object sender, EventArgs e)
{
string s = "";
//Iterate through the table rows finding the controls
//Using count -1 as we still have the pre-emptive row
for(int i = 0; i < Table1.Rows.Count-1; i++)
{
TextBox tb = (TextBox)Table1.Rows[i].FindControl(string.Format("txt{0}",i+1));
s += "," + tb.Text;
}
lblResult.Text = s;
lblResult.Visible = true;
}
protected override void OnLoadComplete(EventArgs e)
{
//Get rid of pre-emptive row if we don't need it
if (IsPostBack)
{
if (!rowNeeded)
{
Table1.Rows.RemoveAt(Table1.Rows.Count - 1);
}
}
base.OnLoadComplete(e);
}