如何使用GridView中的TemplateFields保留文本框的值

时间:2019-07-02 23:25:22

标签: c# asp.net gridview datatable

我有一个GridView,它列出了我的mysql数据库表中的数据。另外,我为GridView创建了两个TemplateFields。第一个TemplateField显示数据库表中的数据,第二个TemplateView包含1x asp:TextBox(又名数量)和2x asp:Buttons(又名+/-按钮,它们会更改数量TextBox内的值)。事件中,我还有一个搜索文本框,用于过滤GridView中显示的行。这是搜索GridView文本框的背后代码:

<asp:GridView id="GridView1" EnableViewState="true"  AutoGenerateColumns="false" PageSize="100" ShowHeader="false" DataKeyNames="logic_code" AllowPaging="true" runat="server" Style="width:100%;margin-top:45px;">
<Columns>


<asp:BoundField DataField="QUANTITY" runat="server" readonly="true" />

<asp:TemplateField HeaderText="Product_Template" runat="server"> 


<ItemTemplate>
<asp:label id="supplier_number" runat="server" Style="font-weight:bold;font-size:28px;" Text='<%# Eval("supplier_number")%>' /> <asp:label id="total_inventory" runat="server" Text='<%# Eval("total_inventory")%>' Style="float:right;" />
<br />
<asp:label id="sequence" runat="server" Text='<%# Eval("sequence")%>' Style="float:right;" />
<br />
<asp:Image id="product_image" runat="server" Height="320px" Width="320px" ImageUrl='<%# Eval("image_location")%>' />
<br />
<asp:label id="product_description" runat="server" Text='<%# Eval("description")%>' Style="white-space:nowrap;" /> &nbsp<asp:label id="unit_of_price" runat="server" Text='<%# Eval("unit_of_price")%>' Style="float:right;font-size:10px;margin-top:16px;margin-right:5px;margin-left:1px;" /><asp:label id="price_pref" runat="server" Text='<%# "$" + Eval("price_pref")%>' Style="float:right;font-size:22px;font-weight:bold;" /> 
</ItemTemplate>

</asp:TemplateField>   
<asp:TemplateField HeaderText="Product_Template1" runat="server" ItemStyle-Width="150px"> 


<ItemTemplate runat="server">
<asp:Button id="add" runat="server"  Text="+" Width="45px" Style="float:right;" OnClick="addClicked" autopostback="true" UseSubmitBehavior="true"></asp:Button> <asp:Button id="subtract" runat="server" Text="-" Style="float:right;" OnClick="subtractClicked" autopostback="true" UseSubmitBehavior="true" Width="45px"></asp:Button>
<asp:TextBox id="qty_ordered" runat="server" Text="0" Enabled="false" Style="float:right;" Width="57px" EnableViewState="true" ReadOnly="true" />

<asp:Label id="unit_display" runat="server" Style="float:right;" />

<asp:Label id="sequenceID" runat="server" Text='<%# Eval("sequence")%>' Visible="false" Enabled="false" />
<asp:Label id="unit_code1" runat="server" Text='<%# Eval("unit_code")%>' Visible="false" Enabled="false" />
<asp:Label id="supplier_no" runat="server" Text='<%# Eval("supplier_number")%>' Visible="false" Enabled="false" />
<asp:Label id="total_inventory1" runat="server" Text='<%# Eval("total_inventory")%>' Visible="false" Enabled="false" />
<asp:Label id="logic_code1" runat="server" Text='<%# Eval("logic_code")%>' Visible="false" Enabled="false" />
<asp:Label id="unit_of_price1" runat="server" Text='<%# Eval("unit_of_price")%>' Visible="false" Enabled="false" />
<asp:Label id="price_pref1" runat="server" Text='<%# Eval("price_pref")%>' Visible="false" Enabled="false" />
<asp:Label id="special_price1" runat="server" Text='<%# Eval("special_price")%>' Visible="false" Enabled="false" />
<asp:Label id="description1" runat="server" Text='<%# Eval("description")%>' Visible="false" Enabled="false" />
<asp:Label id="tester" runat="server" Text='<%# Eval("description")%>' Visible="false" Enabled="false" />
<asp:Label id="test2" runat="server" Visible="true" Enabled="false" />


</ItemTemplate>

</asp:TemplateField>   




</Columns>
</asp:GridView>

首先,我尝试将每个行的TextBox.Text保存到ViewState,但是没有成功,然后我尝试在DataBind()之前动态地向DataTable添加新列,但是这又往南走了...按钮(+/-)和当PostBack来自按钮本身时,TextBox可以正常工作。但是,一旦我使用上面的c#代码过滤了GridView,TextBox就会全部变回“ 0”并丢失其值。我认为动态添加新列是一种方法,我只是不确定如何在不创建EditTemplateFields的情况下保存/更新值。

这是我的GridView的asp.net代码:

private void BindGrid()
    {

    string constr = ConfigurationManager.ConnectionStrings["default"].ConnectionString;
            using (MySqlConnection con = new MySqlConnection(constr))
            {
            con.Open();
                using (MySqlCommand cmd = new MySqlCommand("SELECT logic_code,description,image_location,product_group,supplier_number,sequence,unit_code,unit_of_price,location,sales_date,price_pref,special_price,in_stock,total_inventory,new_products FROM products"))
                {
                    using (MySqlDataAdapter da = new MySqlDataAdapter())
                    {
                        cmd.Connection = con;
                        da.SelectCommand = cmd;
                        using (DataTable dt = new DataTable())
                        {
                            da.Fill(dt);
                            GridView1.DataSource = dt;
                            dt.Columns.Add(new DataColumn("QUANTITY", System.Type.GetType("System.Double")));

                            GridView1.DataBind();
                        con.Close();


                        }
                    }
                }
            }


    }

这是当GridView未被搜索框过滤时如何在PageLoad上填充GridView的代码。

protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            BindGrid();
        }






        if (string.IsNullOrEmpty(txtSearch.Text))
        {
        //txtSearch.Attributes.Add("CssStyle", "cursor");
            txtSearch.Attributes.Add("placeholder", " Showing All Products");
        }


        //foreach(GridViewRow row in GridView1.Rows)
        //{
        //    if (IsPostBack)
        //    {
        //        if (ViewState["purchased"].ToString() != null)
        //        {
        //            qty.Text = ViewState["purchased"].ToString();
        //        }
        //    }
        //}


    }

PageLoad在这里:

EnableViewState = "true"

页面顶部也有private void SearchProducts()

***注意:在每个按钮(+/-)上使用下面的代码,即使通过回发也可以通过读取ViewState正确填充我的标签,因此ViewState似乎可以很好地保存。但是,一旦我调用for(int i = 0; i < GridView1.Rows.Count; i++) { Label test222 = (Label)GridView1.Rows[i].FindControl("test2"); TextBox qty2 = (TextBox)GridView1.Rows[i].FindControl("qty_ordered"); ViewState["purchased"] = qty2.Text; test222.Text = ViewState["purchased"].ToString(); }

,标签的值(ViewState值)就会重置。
render() {
  return (
    <div>
       L'utilisateur <b>{this.state.loggedIn ? "est actuellement" : "n'est pas"}</b> connecté.
    </div>
  )
}

,这里有两个快照:(如您所见,当我在搜索文本框中输入“ Benus”时,gridview会被正确过滤,但是所有TextBox值都将重置为“ 0”)

BindGrid() and addClicked/subtractClicked events

SearchProducts()

0 个答案:

没有答案