【问题标题】:How to insert Values from dynamically generated text-boxes in placeholder control into database?如何将占位符控件中动态生成的文本框的值插入数据库?
【发布时间】:2014-02-21 16:51:05
【问题描述】:

我在按钮点击事件上动态生成超过 1 个文本框。而且我将这些文本框的创建限制为最多 5 个。但我无法跟踪动态生成的文本框中插入的值以将其插入数据库表中。 这就是我正在做的-

<table border="1" width="1000px">
    <tr>
    <td class="style1">Add Text Box: </td>
    <td class="style2">
        <asp:TextBox ID="txt1" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="Add More" 
            onclick="Button1_Click" /><br />
        <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>      
        </td>
    </tr>
    <tr><td colspan="2" align="center">
        <asp:Button ID="Button2" runat="server" Text="Submit" onclick="Button2_Click" />
        <br />
        </td></tr>
    </table>

我的cs代码是-

public partial class DynamicTextbox : System.Web.UI.Page
{
    General_Logic g1 = new General_Logic();
    DataTable dt = new DataTable();
    int rows = 0;
    List<string> ControlIdList = new List<string>();
    int Counter = 1;
    protected override void LoadViewState(object SavedState)
    {
        base.LoadViewState(SavedState);
        ControlIdList = (List<string>)ViewState["ControlIdList"];
        foreach (string Id in ControlIdList)
        {
            Counter++;
            TextBox tb = new TextBox();
            tb.ID = Id;
            LiteralControl linebreak = new LiteralControl();
            PlaceHolder1.Controls.Add(tb);
            PlaceHolder1.Controls.Add(linebreak);
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        if (Counter <= 4)
        {
            Counter++;
            TextBox tb = new TextBox();
            tb.ID = "TextBox" + Counter;
            tb.Text = "";
            LiteralControl linebreak = new LiteralControl("<br />");
            PlaceHolder1.Controls.Add(tb);
            PlaceHolder1.Controls.Add(linebreak);
            ControlIdList.Add(tb.ID);
            ViewState["ControlIdList"] = ControlIdList;
        }
        else
        {
            Button1.OnClientClick = null;
            Response.Write("<script>alert('Maximum Entry is 5');</script>");
        }
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
        try
        {
            string s = null;
            for (int parcount = 0; parcount == parcount; parcount++)
            {
                s = Request.Form["Textbox" + parcount.ToString()];
                if (s == null)
                {
                    rows = g1.ExecDB("insert into tbl_products(product1) values('" + txt1.Text.ToString() + "')");
                    break;
                }
                else
                {
                    //Label1.Text = s.ToString();
                    Response.Write(s);
                    rows = g1.ExecDB("insert into tbl_products(product1,product2,product3,product4,product5) values('" + txt1.Text.ToString() + "','" + s.ToString() + "','" + s.ToString() + "','" + s.ToString() + "','" + s.ToString() + "')");
                }
            }
        }
        catch (Exception ex)
        {
            Response.Write(ex.ToString());
        }
    }
}

写了这么多代码后,我只能从第一个文本框中插入数据,但不能从动态生成的文本框中插入数据。我在动态文本框的数据库表中得到空值。请指导我的代码哪里出了问题?

【问题讨论】:

  • 您是否在 Button2_Click 事件上运行无限循环??
  • @KarthikAMR 是的。实际上,我在搜索时从某个地方得到了这个建议。

标签: c# asp.net sql textbox


【解决方案1】:

s = Request.Form["Textbox" + parcount.ToString()];中的Textbox更改为TextBox,即;

s = Request.Form["TextBox" + parcount.ToString()];

原因:

因为您创建“文本框”并通过“文本框”检索。

看到你的逻辑后,我需要建议你遵循复杂的逻辑。所以如果我理解你的逻辑。下面的代码会对你有所帮助。

protected void Button2_Click(object sender, EventArgs e)
    {
         try
        {
            string s = null;
            int  limit = 4;
            string[] DBvalues = new string[5];

            for (int parcount = 0; parcount <=limit; parcount++)
            {
                s = Request.Form["TextBox" + parcount.ToString()];
                if (parcount == 0)
                {
                    DBvalues[parcount] = txt1.Text;
                }
                else
                {
                    DBvalues[parcount] = Request.Form["TextBox" + (parcount + 1).ToString()];
                }


                //}
            }
         //converting null values to any default value.i take NULL  
          for (int i=0; i <= 4;i++ )
            {
                if (DBvalues[i] == null)
                {
                    DBvalues[i] = "NULL";
                }
            }
            rows = g1.ExecDB("insert into tbl_products(product1,product2,product3,product4,product5) values('" + DBvalues[0].ToString() + "','" + DBvalues[1].ToString() + "','" + DBvalues[2].ToString() + "','" + DBvalues[3].ToString() + "','" + DBvalues[4].ToString() + "')");
            Response.Write(DBvalues);
        }
        catch (Exception ex)
        {
            Response.Write(ex.ToString());
        }
    }

【讨论】:

  • 我尝试使用此代码,但现在出现此错误 - System.String[]System.NullReferenceException: Object reference not set to an instance of an object.
  • 查看我更新的答案。您已将空值转换为任何默认值。因为将空值转换为字符串引发异常。
  • 你有答案吗?
  • Response.Write(DBVALUES)。我希望这会导致错误
  • 注释或删除“Response.Write(DBVALUES)”行。它只是显示数据。
猜你喜欢
  • 2016-10-25
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
相关资源
最近更新 更多