【问题标题】:C# ASP.NET Add "remove button" to List in grid-viewC# ASP.NET 将“删除按钮”添加到网格视图中的列表
【发布时间】:2021-12-29 14:22:17
【问题描述】:

我正在使用 C# 和 ASP.NET 制作一个结帐程序(因为它必须离线工作(作为备份结帐寄存器))。 我将列表放入 GridView 中,但我想让每个添加的列表添加到 GridView 中,它会自动创建一个“删除按钮”。 我试图在互联网上找到,但大多数都是与数据库相关的(删除数据库中的项目),而不仅仅是删除 GridView 中的一行。

我有什么:

public static List<KassaItem> KassaList = new List<KassaItem>();
    
protected void Page_Load(object sender, EventArgs e)
{        
    TextBox1.Focus();
}

public string Connection(string eannr)
{
    // connection stuff here
}

public class KassaItem
{
    public string EanNr { get; set; }
    public string zoekName { get; set; }
    public int Quantity { get; set; }
    public double Price { get; set; }          

    public KassaItem(string eanNr,string zoekname, int quantity, double price)
    {
        EanNr = eanNr;
        zoekName = zoekname;
        Quantity = quantity;
        Price = price;
    }
}

protected void TextBox1_TextChanged(object sender, EventArgs e)
{       
    double TotalPrice = 0;
    string zoekfunctie = Connection(TextBox1.Text);

    string[] zoekSplit = zoekfunctie.Split('-');        

    string zoekNaam = zoekSplit[1];
    double Prijs = Convert.ToDouble(zoekSplit[0]);           

    List<KassaItem> KassaNew = new List<KassaItem>();
    bool isNew = true;

    if (TextBox1.Text != "")
    {
        foreach (var KassaItem in KassaList)
        {
            if (TextBox1.Text == KassaItem.EanNr)
            {
                KassaNew.Add(new KassaItem(KassaItem.EanNr, KassaItem.zoekName, KassaItem.Quantity + 1, KassaItem.Price + Prijs));
                isNew = false;
            }
            else
            {
                KassaNew.Add(KassaItem);
            }
        }

        if (isNew)
        {                    
            KassaNew.Add(new KassaItem(TextBox1.Text, zoekNaam, 1, Prijs));
        }

        KassaList = KassaNew;
        GridView1.DataSource = KassaList;
        GridView1.DataBind();
                            
        foreach(var item in KassaList)
        {
            TotalPrice += item.Price;                
        }

        // here i want to make a button
        foreach(var item in KassaList)
        {
            Button RemoveButton = new Button();
            RemoveButton.Text = "remove product??";
            RemoveButton.ID = "ButtonRemove_" + Item.EanNr;
        }       
    }
        
    TextBox1.Text = "";
    TextBox1.Focus();
    TotalItems.Text = TotalPrice.ToString();
}

我想要的基本上是: 如何制作一个“按钮”分配给该行时,创建该行以在单击该行时删除该行。

附: 如果我得到一个我可能没有看过/错过的文档的链接,我也很高兴。 提前祝大家新年快乐!

【问题讨论】:

  • The documentation 会满足您的所有需求。 GridView 是一个复杂的对象,我鼓励您花一些时间研究它。顺便说一句,使用 WebForms“因为它必须离线工作”并不是使用 WebForms 的理由。如果可行,请考虑使用更现代的 Web 框架。

标签: c# asp.net list gridview


【解决方案1】:

好的,所以我们有一个网格视图。我们想放入一个简单的平面 jane asp.net 按钮,当我们单击它时,我们删除该行。但是我们还没有从数据库中删除。我们当然可以在 gv 下方有一个按钮,上面写着“保存更改”,然后实际上会针对数据库进行删除。

那么,让我们来做第一部分吧。 GV,加载数据,添加删除按钮。

所以我们有这个标记:

        <asp:GridView ID="GHotels" runat="server" CssClass="table"
            width="50%" AutoGenerateColumns="False" DataKeyNames="ID" >
            <Columns>
                <asp:BoundField DataField="FirstName" HeaderText="FirstName"     />
                <asp:BoundField DataField="LastName" HeaderText="LastName"       />
                <asp:BoundField DataField="HotelName" HeaderText="HotelName"     />
                <asp:BoundField DataField="City" HeaderText="City"               />
                <asp:BoundField DataField="Description" HeaderText="Description" />
                <asp:TemplateField HeaderText = "Delete" ItemStyle-HorizontalAlign ="Center" >
                    <ItemTemplate>
                    <asp:Button ID="cmdDelete" runat="server" Text="Delete" 
                       CssClass="btn" 
                        />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <br />
        <asp:Button ID="cmdSave" runat="server" Text="Save Changes" CssClass="btn" />
        <asp:Button ID="cmdUndo" runat="server" Text="Undo Changes" CssClass="btn"
            style="margin-left:25px" />

我在 GV 下方放置了两个按钮 - 我们稍后再处理。

所以,现在这里是我们加载 GV 的代码 - 请注意我们如何保持驱动该表的表。所以我们可以从数据库中加载表,现在我们的操作可以针对驱动 gv 的表进行 - 但我们不会将更改发送回数据库(在这种情况下更改 = 删除 - 但它可能是编辑或添加,如果我们想要 - 这也很容易!)。

好的,所以我们的代码是这样的:

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

    void LoadData()
    {
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            string strSQL = "SELECT * FROM tblHotels ORDER BY HotelName";
            using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
            {
                conn.Open();
                rstData.Load(cmdSQL.ExecuteReader());
            }
        }
    }

    void LoadGrid()
    {
        GHotels.DataSource = rstData;
        GHotels.DataBind();
    }    
}

现在我们有了这个:

所以,现在让我们为删除按钮添加事件存根后面的代码:

我们不能双击按钮跳转到事件存根后面的点击代码,所以我们必须在标记中输入 onclick=(注意非常接近你是如何为按钮创建点击事件的) . 你看这个:

因此,我们选择创建新事件(看起来发生的次数不多,但我们现在可以翻转到后面的代码 - 您会看到我们为我们创建的事件存根。

好的,所以我们要做的就是从 gv 中删除(删除)该行。代码如下所示:

    protected void cmdDelete_Click(object sender, EventArgs e)
    {
        Button btn = sender as Button;
        GridViewRow gRow = btn.NamingContainer as GridViewRow;
        int? pkID = (int?)GHotels.DataKeys[gRow.DataItemIndex]["ID"];
        // find row and delete
        DataRow[] DelRow = rstData.Select("ID = " + pkID);
        DelRow[0].Delete();
        LoadGrid();
    }

现在,删除代码有点乱。在大多数情况下,我可以这样做:

rstData.Rows[gRow.DataItemIndex].Delete();

但是,当您从表中删除时,我们还没有完成 rstData.AcceptChanges。所以 table 和 Gv 之间的行同步就搞砸了。

现在我可以接受对表的更改,但如果我们这样做,那么我们会丢失已删除的行 - 我们需要一个最终保存按钮来实际提交并执行删除。因此,我们通过 PK 行 id 在表上使用查找,我们消除了这个问题,但更重要的是 PERSERVE 删除了该数据表中的行。 (通过不接受更改)。我们这样做,因为现在我们可以向数据库发送一次更新,删除的行。但是,如前所述,问题是当您删除 rstData 行但不接受更改时 - 它仍然存在,因此当我们提供给 GV 时,那些已删除的行不会显示 - 但数据索引仍然设置,但是此时的数据索引与表中的行不匹配。

所以,现在当我们单击删除按钮时,该行将被删除。但是我们没有从数据库中删除该行。

撤消命令?好吧,它只会运行我们在第一页 (postback = false) 代码上的相同代码,因此我们可以轻松地撤消删除操作。

如您所见 - 这里的代码不多。

如果您愿意,我可以发布我们将用于此的实际删除代码,以将删除提交到数据库。有了上面,只有一个更新命令将删除发送到数据库。

【讨论】:

    【解决方案2】:

    感谢阿尔伯特,但得到了答案。

    C#:

    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
        List<KassaItem> KassaNew = new List<KassaItem>();
        TableCell NR = GridView1.Rows[e.RowIndex].Cells[1];
        string eanrNR = Convert.ToString(NR.Text);
    
        string zoekfunctie = Connection(eanrNR);
        string[] zoekSplit = zoekfunctie.Split('-');
        string zoekNaam = zoekSplit[1];
        double Prijs = Convert.ToDouble(zoekSplit[0]);
    
        GridViewRow row = GridView1.Rows[e.RowIndex];
        TableCell cell = GridView1.Rows[e.RowIndex].Cells[3];
        int quantity = Convert.ToInt32(cell.Text);
        int newquantity = quantity - 1;
        if (newquantity == 0)
      {
        KassaList.RemoveAt(e.RowIndex);
      }
       else
      {
            
        foreach (var KassaItem in KassaList)
      {
      if (eanrNR == KassaItem.EanNr)
        {
        KassaNew.Add(new KassaItem(KassaItem.EanNr, KassaItem.zoekName, newquantity, KassaItem.Price - Prijs));
        }
        else
        {
          KassaNew.Add(KassaItem);
        }
      }
        KassaList = KassaNew;
      }
    
      foreach (var item in KassaList)
      {
        TotalPrice += item.Price;
    
      }
    
      GridView1.DataSource = KassaList;
      GridView1.DataBind();
    
      TextBox1.Text = "";
      TextBox1.Focus();
      TotalItems.Text = TotalPrice.ToString();
    
    }
    
    protected void GridView1_RowDeleted(object sender, GridViewDeletedEventArgs e)
    {
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多