Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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表行计数未增加_C#_Asp.net_Dynamic - Fatal编程技术网

C# 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

我有一个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 = "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);
}