如何在数据库中存储视图列表中的信息

How to store information in the view list in the database

如何将在列表视图中创建的行保存到我的数据库中?如何访问(列表视图)中的值?如何将视图列表中创建的值保存到数据库中?

<asp:ListView ID="ListView1" runat="server">
    <ItemTemplate runat="server">
        <tr class="text-center">
            <td class="product-remove"></td>

            <td class="image-prod">
                <div class="">
                    <asp:Image ID="Image1" CssClass=" img" ImageUrl='<%# "../img/" + Eval("picture" )%>' runat="server" />
                </div>
            </td>

            <td class="product-name"><%# Eval("namebook") %> </td>


           
                <td id="t_Plural" runat="server" class="price "><%# Eval("Price") %> </td>
                
            



            <td class="quantity"><%# Eval("titel") %></td>



            <td class="col-2">


                <asp:Button ID="delete" CssClass="btn btn-outline-danger" CommandArgument='<%# Eval("id")%>' OnClick="delete_Click" runat="server" Text="حذف کالا" />


            </td>

            <td>
                <%--                                            <input id="quantity2" runat="server" type="number" AutoPostBack="true" oninput="lod_gheymat" onserverclick="lod_gheymat" value="" min="1" max="20" />--%>
                <asp:TextBox ID="quantity2" runat="server" CssClass="input-wrap" AutoPostBack="true" OnTextChanged="lod_gheymat" Text="1" min="1" max="20"></asp:TextBox>
            </td>

            <td >
                <div class="row">
               <asp:Label ID="lbl_Plural" runat="server" Text="0"></asp:Label>&nbsp;&nbsp;&nbsp;&nbsp; <span class="row"> تومان</span>
                    </div>
            </td>
        </tr>

    </ItemTemplate>
</asp:ListView>

解决此类问题的方法是不要尝试从列表视图添加到数据库。

你所做的就是获取数据(比如在数据 table 中)。

然后将数据table发送到列表视图。

现在,如果你想说一个“添加新行”按钮? 将行添加到数据 table,然后 re-bind 列表视图。

下一个?

您问的是如何将其添加到数据库中,但这不是它最初形成的地方吗?

你问如何向这个 LV 添加行,但用户将如何添加图片,这让人很困惑?

接下来,这个 post 是如何得到 up-votes 的?我假设 up-votes 没有被搞乱?我会把这个问题放在一边,但这里有些不合适。

好的,那么,如何添加行,以及如何将这些行保存回数据库?

您可以通过以下方式实现此目标:

首先,我们假设现在可以自由编辑 LV。这意味着使用文本框。

所以,我们有这个标记:

(您拥有的 LV 可能并不重要,但此处概述的“想法”应该可以正常工作)。

    <style> .borderhide input, textarea {border:none}</style>
    <div style="width:70%;padding:20px">
    <h2>Fighter Prints</h2>
    <asp:ListView ID="ListView1" runat="server" DataKeyNames="ID" >
        <ItemTemplate>
            <tr style="">
                <td><asp:TextBox ID="Fighter" runat="server" Text='<%# Eval("Fighter") %>' TextMode="MultiLine" /></td>
                <td><asp:TextBox ID="Engine" runat="server" Text='<%# Eval("Engine") %>'   TextMode="MultiLine" Width="200px" /></td>
                <td><asp:TextBox ID="Thrust" runat="server" Text='<%# Eval("Thrust") %>'  Width="70px" /></td>
                <td><asp:TextBox ID="Description" runat="server" Text = '<%#Eval("Description") %>' 
                    TextMode="MultiLine" Width="340px" Rows="5"  /></td>
                <td>
                    <asp:Image ID="iPreview" runat="server" Height="68px" Width="149px" 
                        ImageUrl='<%# Eval("ImagePath") %>'/>
                </td>
                <td><asp:TextBox ID="Qty" runat="server" Text='<%# Eval("Qty") %>'  style="width:30px;text-align:right"/></td>
                <td><asp:TextBox ID="Price" runat="server" Text='<%# string.Format("{0:c2}",Eval("Price")) %>' style="Width:70px;text-align:right"/></td>
                <td><asp:TextBox ID="Total" runat="server" Text='<%# string.Format("{0:c2}",Eval("Total")) %>' style="Width:70px;text-align:right"  /></td>
            </tr>
        </ItemTemplate>
        <LayoutTemplate>
           <table id="itemPlaceholderContainer" runat="server" 
               class="table table-hover borderhide ">
               <tbody>
                <tr runat="server" style="" >
                    <th runat="server">Fighter</th>
                    <th runat="server">Engine</th>
                    <th runat="server">Thrust (lbs)</th>
                    <th runat="server">Description</th>
                    <th runat="server">Preview</th>
                    <th runat="server"  style="text-align:right">Qty</th>
                    <th runat="server" style="width:70px;text-align:right">Price</th>
                    <th runat="server" style="width:70px;text-align:right">Total</th>
                </tr>
                <tr id="itemPlaceholder" runat="server" />
               </tbody>
                 <tfoot>
                     <tr>
                         <td></td><td></td><td></td><td></td><td></td><td></td><td>Total</td>
                         <td><asp:TextBox ID="MyTotal" runat="server" Text="0" Width="70px" Style="text-align:right"></asp:TextBox></td>
                     </tr>
                </tfoot>
        </table>
        </LayoutTemplate>
        </asp:ListView>

好的,现在要加载的代码是这样的:

    DataTable rstData = new DataTable();
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            LoadGrid();
            Session["rstData"] = rstData;
        }
        else
            rstData = Session["rstData"] as DataTable;             
    }

    void LoadGrid()
    {
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (SqlCommand cmdSQL = new SqlCommand("SELECT * from Fighters ", conn))
            {
                conn.Open();
                rstData = new DataTable();
                rstData.Load(cmdSQL.ExecuteReader());
                rstData.Columns.Add("Total", typeof(decimal),"[Qty] * [Price]");
                ListView1.DataSource = rstData;
                ListView1.DataBind();

                decimal myTotal = 0;
                foreach (ListViewItem OneRow in ListView1.Items)
                {
                    TextBox MyPrice = OneRow.FindControl("Total") as TextBox;
                    myTotal += Decimal.Parse(MyPrice.Text, NumberStyles.Currency);
                }
                // now update the final total label
                TextBox lblTotal = ListView1.FindControl("MyTotal") as TextBox;
                lblTotal.Text = string.Format("{0:c2}", myTotal);
            }
        }
    }

现在我们有了这个:

好的,对于上面的内容,请注意我们是如何在 LV 下面添加 3 个按钮的。

并且因为我想要按钮中的“可爱”图标,所以我放入了 html 按钮,而不是 asp.net 按钮。但是,有了“id”和 runat=server,它们的工作方式是一样的。

所以,我们的 3 个按钮是(紧跟在 LV 标记之后)

        <div style="float:left">
            <button id="cmdSave" runat="server" class="btn" onserverclick="cmdSave_ServerClick">
                <span aria-hidden="true" class="glyphicon glyphicon-save"></span> &nbspSave
            </button>
            <button id="cmdUndo" runat="server" class="btn" style="margin-left:10px" onserverclick="cmdUndo_ServerClick">
                <span aria-hidden="true" class="glyphicon glyphicon-retweet"></span> &nbspUn do
            </button>
        </div>
        <div style="float:right">
            <button id="cmdAddNew" runat="server" class="btn" onserverclick="cmdAddNew_ServerClick">
                <span aria-hidden="true" class="glyphicon glyphicon-new-window"></span> &nbspAdd New
            </button>
        </div>

好的,所以对于 3,un-do 按钮代码很简单:

    protected void cmdUndo_ServerClick(object sender, EventArgs e)
    {
        // undo changes - just re-load the lv
        LoadGrid();
    }

好的,现在是保存按钮。此保存按钮将:

保存任何新行,并保存我们所做的任何编辑。请记住,因为我们使用了文本框,所以我可以使用 Tab 键——编辑任何行。如果我点击保存,那么我们将保存所有编辑以及添加的任何新行。

因此,保存按钮的作用是:

    protected void cmdSave_ServerClick(object sender, EventArgs e)
    {
        GridToTable(); // send lv to table
        SaveToDatabase();
    }

所以,现在我们需要将 LV 发送到 table 的例程。该代码是这样的:

   void GridToTable()
    {
        // pull grid rows back to table.
        foreach (ListViewItem rRow in ListView1.Items)
        {
            int RecordPtr = rRow.DataItemIndex;
            DataRow OneDataRow;
            OneDataRow = rstData.Rows[RecordPtr];
            OneDataRow["Fighter"] = ((TextBox)rRow.FindControl("Fighter")).Text;
            OneDataRow["Engine"] = ((TextBox)rRow.FindControl("Engine")).Text;
            OneDataRow["Thrust"] = ((TextBox)rRow.FindControl("Thrust")).Text;
            OneDataRow["Description"] = ((TextBox)rRow.FindControl("Description")).Text;
            OneDataRow["Qty"] = ((TextBox)rRow.FindControl("Qty")).Text;
            OneDataRow["Price"] = Decimal.Parse(((TextBox)rRow.FindControl("Price")).Text,
                                  NumberStyles.Currency);
        }
    }

因此,上面的内容进行任何编辑 - 您编辑的任何行,并从 LV->rstData 发送更改。

所以,现在我们需要 rstData 保存所有行、所有编辑、所有添加回数据库,代码是这样的:

    void SaveToDatabase()
    {
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (SqlCommand cmdSQL = new SqlCommand("SELECT * FROM Fighters", conn))
            {
                conn.Open();
                SqlDataAdapter da = new SqlDataAdapter(cmdSQL);
                SqlCommandBuilder daU = new SqlCommandBuilder(da);
                da.Update(rstData);                    
            }
        }
    }

所以,这就是我们所需要的。

最后一个按钮“添加行”也很简单,看起来像这样:

    protected void cmdAddNew_ServerClick(object sender, EventArgs e)
    {
        // user might have done some editing, so, pull LV to table
        // just in case
        GridToTable();

        // add new row to database
        DataRow MyNewRow = rstData.NewRow();
        // setup some defaults and values for this new row
        //MyNewRow["DateCreate"] = DateTime.Now;
        rstData.Rows.Add(MyNewRow);
        ListView1.DataSource = rstData;
        ListView1.DataBind();
    }

就是这样。所以,如果我查看上面的 LV,然后点击 add-new,我们现在有这个:

所以我可以只填写信息,然后点击保存。如果我点击 un-do,则不会添加(也不会保存)该行。

请注意我们是如何使用一小段代码来进行保存的。请注意我们是如何没有弄乱一大堆模板的(从而拯救世界贫困)。

所以,这真的很好用,代码不多,真正的秘密“想法”是持久化 rstData。这使得添加新行变得非常容易,但更重要的是将编辑发送回数据库非常简单,而且一个保存命令不仅会保存 LV 中的任何编辑,还会在 LV 中创建新行数据库给你。因此,您可以在该 lv 中进行大量切换 - 几乎就像 excel。所以我们没有一堆乱七八糟的“编辑”按钮,也没有那些爵士乐。只是一个简单的数据网格和一个简单的保存或添加新按钮。

请注意 GridToTable 的工作方式。因为这显示了如何从 LV 中获取和获取值,所以这是您问题的“主要”部分。所以,你可以抓取 LV 的任何一行,但是要从一行中提取值,你必须使用“FindControl”。

protected void savetodatabase_Click(object sender, EventArgs e)
{

    System.Web.UI.HtmlControls.HtmlGenericControl Labelid;
    TextBox quantity2;
    foreach (ListViewItem rRow in ListView1.Items)
    {
        itemlist iteml = new itemlist();
        quantity2 = (TextBox)rRow.FindControl("quantity2");
        Labelid = (System.Web.UI.HtmlControls.HtmlGenericControl)rRow.FindControl("Labelid");
        iteml.quantity = quantity2.Text;
        iteml.bookid = Convert.ToInt32(Labelid.InnerText) ;
        iteml.Date = DateTime.Now;
        iteml.userid =  Convert.ToInt32(Session["userid"].ToString()) ;
        DatabaseContext context = new DatabaseContext();

        context.itemlists.Add(iteml);
        context.SaveChanges();

    }

}