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