关于从C#asp.net中动态创建的控件将数据保存到数据库中

时间:2011-07-13 07:13:39

标签: c# asp.net

我创建了动态控件,具体取决于我在下拉列表中选择的内容。 为此,我在dropdownlist的SelectedIndexChanged事件中编写了代码,如下所示:

int N = Convert.ToInt32(ddlpassenger.SelectedValue);
Table t = new Table();
 for (int i = 0; i < N; i++)
        {
            TableRow row = new TableRow();
            TableCell cell = new TableCell();
            TextBox name = new TextBox();
            name.ID = "txtname" + i;
            cell.Controls.Add(name);
            row.Cells.Add(cell);
            t.Rows.Add(row);
            PName_placeholder.Controls.Add(t);
        }

我必须在数据库中保存数据。 为此,我编写了用于在button_click事件中获取该创建控件的值的代码,如下所示:

string pname = "";
        foreach (TableRow tr in t.Rows)
        {
            foreach (TableCell tc in tr.Cells)
            {
                foreach (Control c in tc.Controls)
                {
                    if (c is TextBox)
                    {
                        if (c.ID.StartsWith("txtname"))
                        {
                            TextBox txt = (TextBox)t.FindControl(c.ID);

                            pname = txt.Text;
                            Session["pname1"] = pname;
                        }
                    }
                }
            }
        }

但是我在这里没有得到它的价值,所以我该怎么办? 我编辑的代码如下:

protected void btnsave_Click(object sender, EventArgs e)
{
Table t11 = (Table)PName_placeholder.FindControl("tblname");
        string pname = "";
        foreach (TableRow tr in t11.Rows)
        {
            foreach (TableCell tc in tr.Cells)
            {
                foreach (Control c in tc.Controls)
                {
                    if (c is TextBox)
                    {
                        if (c.ID.StartsWith("txtname"))
                        {
                            TextBox txt = (TextBox)t11.FindControl(c.ID);

                            pname = txt.Text;
                            Session["pname1"] = pname;
                        }
                    }
                }
            }
        }
}

protected void ddlpassenger_SelectedIndexChanged(object sender, EventArgs e)
    {
    int N = Convert.ToInt32(ddlpassenger.SelectedValue);
    Table t = new Table();
        t.ID = "tblname";

    for (int i = 0; i < N; i++)
        {
            TableRow row = new TableRow();
            TableCell cell = new TableCell();
            TextBox name = new TextBox();
            name.ID = "txtname" + i;
            cell.Controls.Add(name);
            row.Cells.Add(cell);
            t.Rows.Add(row);
            PName_placeholder.Controls.Add(t);
    }
    }

Asp.net c# 谢谢。

2 个答案:

答案 0 :(得分:0)

代码中的哪个位置发生了空值?你看到什么例外?

在你的button_click事件中进行保存,在哪里定义?它是传递给处理程序还是类级变量?

分享更多代码将有助于您获得答案 - 所选索引的完整方法更改了事件处理程序和按钮单击将是一个良好的开端。

已编辑添加

t仅适用于SelectdIndexChanged事件处理程序的范围。它不在按钮单击事件处理程序的范围内,这可能是您看到空值问题的原因。

除非你以某种方式坚持那个表(在事件处理程序的范围之外),否则我不知道你将如何完成你正在做的事情。

您能否提供有关您动态创建的控件的更多信息? (至少对我而言)表格在这方面发挥了什么作用还不是很清楚。你一次可以拥有多个动态控件吗?什么是DropDownList用于等等?

第二次修改 在SelectedIndexChanged事件处理程序中,为您创建的表分配ID,例如:

t.ID = "PassengerTable";

这样可以在单击按钮时更轻松地获取表格。

protected void btn_Click(object sender, EventArgs e)
{

    Table t = (Table)PName_placeholder.Controls.FindControls("PassengerTable");

    string pname = "";

    foreach (TableRow tr in t.Rows)
    {
        foreach (TableCell tc in tr.Cells)
        {
            foreach (Control c in tc.Controls)
            {
              if (c is TextBox && c.ID.StartsWith("txtname"))
              {
                      pname = ((TextBox)t.FindControl(c.ID)).Text;

                      Session["pname1"] = pname;
              }
         }
     }
}

这应该可以让你获得每个TextBox的价值 - 但是请注意你需要做的不仅仅是在Session中粘贴TextBox.Text值 - 否则如果你有多个TextBox,你最终会得到最后一个TextBox的值。

另请注意另一张海报关于在回发前初始化期间渲染动态控件的答案 - 如果在用户创建动态控件的时间和他们点击按钮的时间之间可能会发生回发,您可能需要处理pre-init以便他们不会失去他们已经拥有的东西。

答案 1 :(得分:0)

发布回来时,您需要在Page_Init方法中重新创建动态控件。

protected void Page_Init(object sender, EventArgs e)
{
   if (IsPostBack)
  {
     //you dynamic control creation
  }
}

然后ASP.NET将使用值填充它们。