C# ASP.NET 添加 "remove button" 到网格视图中的列表

C# ASP.NET Add "remove button" to List in grid-view

我正在使用 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();
}

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

P.S。 如果我得到 link 我可能没有 seen/missed 的文档,我也很高兴。 提前祝大家新年快乐!

好的,我们有一个网格视图。我们想放入一个简单的平面 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 的代码 - 请注意我们如何坚持驱动此 table 的 table。所以我们可以从数据库加载 table,现在我们的操作可以针对驱动 gv 的 table 进行 - 但我们不会将更改发送回数据库(在这种情况下更改 = 删除 -但如果我们愿意,它可以是编辑或添加 - 这也很容易!)。

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

    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();

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

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

中的行不匹配

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

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

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

如果您愿意,我可以 post 我们将用于将删除提交到数据库的实际删除代码。通过以上,只需一个更新命令即可将删除内容发送到数据库。

感谢阿尔伯特,但得到了解决方法。

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)
{

}