【问题标题】:About saving data into database from dynamically created controls in C# asp.net关于将数据从 C# asp.net 中动态创建的控件保存到数据库中
【发布时间】:2011-07-13 07:13:39
【问题描述】:

我根据我在下拉列表中选择的 no 创建了动态控件。 为此,我在下拉列表的 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# 谢谢。

【问题讨论】:

  • 您是否可能有另一个文本框在另一个单元格中具有空值?目前循环的编写方式,在找到您要查找的值后,它将继续循环。假设其他一切都正常工作,您应该只需要打破所有嵌套循环。

标签: c# asp.net


【解决方案1】:

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

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

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

【讨论】:

  • 但我必须在下拉列表中选择否,然后在选择否后它应该不会生成在下拉列表中选择的动态控件
  • @tina 您必须存储下拉列表的选定值(因为您处理该事件)或使用Form 提取下拉列表的选定值。
【解决方案2】:

代码中的什么地方出现了空值?你看到了什么异常?

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

分享更多代码将帮助您找到答案 - 所选索引更改事件处理程序和按钮单击的完整方法将是一个好的开始。

编辑添加

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

除非您以某种方式保留该表(在事件处理程序的范围之外),否则我看不出您将如何完成您正在做的事情。

您能否提供更多有关您正在动态创建的控件的信息?目前还不是很清楚(至少对我而言)桌子在其中扮演什么角色。您一次可以拥有多个动态控件吗? 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 中的值 - 但请注意,您需要做的不仅仅是将 TextBox.Text 值粘贴到 Session 中 - 否则,如果您有多个 TextBox,您最终会得到仅最后一个 TextBox 的值。

还请注意其他发帖人关于在回发预初始化期间呈现动态控件的答案 - 如果在用户创建动态控件和单击按钮之间可能会发生回发,您可能想要处理预初始化,这样他们就不会丢失他们已经拥有的东西。

【讨论】:

  • t 是在下拉列表的 SelectedIndexChanged 事件中声明的表对象,如上代码
  • 没什么异常,但是当我调试时,我得到的值是空白
  • 我有下拉列表来选择不创建动态控件。如果我选择 3,那么它会创建 3 个控件。 & 我还想在创建的控件中保存值我该怎么做?
  • @Tim 是的,我遇到了我在一个事件中定义 t 并在另一个事件中访问的问题,但是应该如何克服这个问题,请帮我解决这个问题?
  • @Tim 如果我这样做,那么它会抛出错误:在 foreach (TableRow tr in t.Rows) 语句中作为对象引用未设置为对象实例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
相关资源
最近更新 更多