【问题标题】:Textbox In gridview not saving its value in table网格视图中的文本框未将其值保存在表中
【发布时间】:2013-03-13 01:04:05
【问题描述】:

我有一个 gridview gv_Products 和一个 gridview Gv_selected。我的产品 gridview 有一个复选框,选中该复选框时,将在 gv_selected gridview 中输入所选行。
我在gv_selectedgridiew 中添加了一个文本框来输入我想重新订购的数量。我输入的数量在我按下提交按钮后失去它的价值。

<asp:GridView ID="gvSelected" runat="server" 
    AutoGenerateColumns = "False" Font-Names = "Arial" CssClass="gridviewsSmall" Font-Size = "11pt" 
    OnRowDataBound="GridView_gvSelected_RowDataBound" EnableViewState="False"                                    
    EmptyDataText = "No Records Selected"  >
        <Columns>
         <asp:BoundField DataField="ProductId" HeaderText="Product ID" ReadOnly="True" 
            SortExpression="ProductId" />
        <asp:TemplateField HeaderText="Product No" SortExpression="ProductNo">
            <ItemTemplate>
                <asp:Label ID="Label2" runat="server" Text='<%# Bind("ProductNo") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Product Name" SortExpression="Product_name">
            <ItemTemplate>
                <asp:Label ID="Label3" runat="server" Text='<%# Bind("Product_name") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
         <asp:BoundField DataField="SupplierId" HeaderText="Supplier ID" ReadOnly="True" 
            SortExpression="SupplierId" />
            <asp:TemplateField HeaderText="Quantity" SortExpression="Quantity">
                <ItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server"  Text='<%#Bind("Quantity") %>'></asp:TextBox>
                </ItemTemplate>
            </asp:TemplateField>
 </Columns>  
 </asp:GridView>
 <asp:Button ID="btnSendOrder" Visible="false" runat="server" Text="Send Order" 
onclick="btnSendOrder_Click" />

这是我在 gvSelected gridview 中添加行的代码

       private DataTable CreateDataTable()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("ProductId");
        dt.Columns.Add("ProductNo");
        dt.Columns.Add("Product_name");
        dt.Columns.Add("SupplierId");
        dt.Columns.Add("Quantity");

        dt.AcceptChanges();
        return dt;
    }

    private DataTable AddRow(GridViewRow gvRow, DataTable dt)
    {

        DataRow[] dr = dt.Select("ProductId = '" + gvRow.Cells[3].Text + "'");
        if (dr.Length <= 0)
        {
            dt.Rows.Add();
            dt.Rows[dt.Rows.Count - 1]["ProductId"] = gvRow.Cells[3].Text;
            dt.Rows[dt.Rows.Count - 1]["ProductNo"] = (gvRow.FindControl("Label2") as Label).Text;
            dt.Rows[dt.Rows.Count - 1]["Product_name"] = (gvRow.FindControl("Label3") as Label).Text;
            dt.Rows[dt.Rows.Count - 1]["SupplierId"] = (gvRow.FindControl("Label5") as Label).Text;
            dt.Rows[dt.Rows.Count - 1]["Quantity"] = 0;
            dt.AcceptChanges();
        }
        return dt;
    }

    protected void CheckBox_CheckChanged(object sender, EventArgs e)
    {
        GetData();
        SetData();
        BindSecondaryGrid();

    }

    private void BindSecondaryGrid()
    {
        DataTable dt = (DataTable)ViewState["SelectedRecords"];
        gvSelected.DataSource = dt;
        gvSelected.DataBind();
    }

这里是提交按钮!

protected void btnSendOrder_Click(object sender, EventArgs e)
    {

        t_supplier_orders newOrder = new t_supplier_orders();

        newOrder.UserName = User.Identity.Name;
        newOrder.Order_date = DateTime.Now;


        newOrder.Order_status = "Pending";
        MembershipUser myObject = Membership.GetUser();
        Guid UserID = new Guid(myObject.ProviderUserKey.ToString());
        newOrder.UserId = UserID;
        newOrder.SupplierId = Convert.ToInt32(ddl1.SelectedValue);
        newOrder.Received_date = null;


        Bohemian.t_supplier_orders.AddObject(newOrder);
        Bohemian.SaveChanges();


        //------------------------------------------------------------------------+
        //  Create a new OderDetail Record for each item in the gvSelected     |
        //------------------------------------------------------------------------+

        foreach (GridViewRow row in gvSelected.Rows)
        {

            {
                t_supplier_orders_details od = new t_supplier_orders_details();

                     TextBox txt1 = (TextBox)gvSelected.FindControl("TextBox1");

                    od.OrderId = newOrder.OrderId;
                    od.ProductId = Convert.ToInt32(row.Cells[0].Text);
                    od.Product_name = (row.FindControl("Label3") as Label).Text;
                    od.ProductNo = (row.FindControl("Label2") as Label).Text;

                    od.Quantity = Convert.ToInt32(txt1.text);

                    Bohemian.t_supplier_orders_details.AddObject(od);

            }
        }

       Bohemian.SaveChanges();
       lblSuccess.Text = "The Order has been successfully sent to supplier!!";
        lblSuccess.ForeColor=System.Drawing.Color.BlueViolet;
        lblSuccess.Font.Bold = true;

    }

【问题讨论】:

  • 您在代码中的哪个位置检查if(IsPostBack()){}?还要确保您为该 TextBox 属性启用了视图状态,另一种选择是使用会话变量。还编辑您的Tags 以显示 asp.net
  • @Haris...我想你只是有一个小错误。你有: od.ProductNo = (row.FindControl("Label2") as Label).Text;在您的提交按钮中。 od.Quantity = Convert.ToInt32(txt1.text);对于数量 od.Quantity = Convert.ToInt32((row.FindControl("txt1") as TextBox).Text);
  • @Haris...此代码 TextBox txt1 = (TextBox)gvSelected.FindControl("TextBox1");找不到您要查找的控件,因为它们 TextBos 是每行而不是 gridview
  • 我已经尝试过这种方式,但它再次不起作用..
  • 什么意思?

标签: c# asp.net


【解决方案1】:

我假设您在每次回发时分配DataSourceDataBind GridView。这将覆盖所有更改。

因此,将您的代码包装在 !IsPostBack 检查中:

protected void Page_Load()
{
    if(!IsPostBack)
    {
        BindSecondaryGrid();
    }
}

顺便说一句,您不应该将 DataTable 存储在 ViewState 中,因为那样会炸毁它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 2013-03-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多