Δεν νομίζω ότι το πρόβλημα σου έχει να κάνει με τη πηγή των δεδομένων σου (αν έρχονται από τη βάση ή από άλλη πηγή). Το πρόβλημα σου οφείλεται πιθανά στη μέθοδο Page_Load. Αν την έχεις αφήσει όπως είναι στο Sample που κατέβασες και δεν κάνεις έλεγχο αν έχεις έρθει από postback ή όχι στη σελίδα, τότε εκτελείτε κάθε φορά η DataBind() μέθοδος πάνω στα DataGrids με αποτέλεσμα τα events από τα ButtonCollumns να "καταπίνονται". Δοκίμασε να κάνεις DataBind μόνο στη περίπτωση που δεν έχεις postback όπως στο παράδειγμα που επισυνάπτω...
Ελπίζω έτσι να λυθεί το πρόβλημα σου.
<%@ Page enableViewState="True" %>
<%@ Import Namespace="System.Data" %>
<HTML>
<script language="C#" runat="server">
DataTable Cart;
DataView CartView;
ICollection CreateDataSource() {
DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32)));
dt.Columns.Add(new DataColumn("StringValue", typeof(string)));
dt.Columns.Add(new DataColumn("DateTimeValue", typeof(DateTime)));
dt.Columns.Add(new DataColumn("BoolValue", typeof(bool)));
dt.Columns.Add(new DataColumn("CurrencyValue", typeof(double)));
for (int i = 0; i < 9; i++) {
dr = dt.NewRow();
dr[0] = i;
dr[1] = "Item " + i.ToString();
dr[2] = DateTime.Now;
dr[3] = (i % 2 != 0) ? true : false;
dr[4] = 1.23 * (i+1);
dt.Rows.Add(dr);
}
DataView dv = new DataView(dt);
return dv;
}
void Page_Load(Object sender, EventArgs e)
{
if (Session["DG5_ShoppingCart"] == null) {
Cart = new DataTable();
Cart.Columns.Add(new DataColumn("Item", typeof(string)));
Cart.Columns.Add(new DataColumn("Price", typeof(string)));
Session["DG5_ShoppingCart"] = Cart;
}
else {
Cart = (DataTable)Session["DG5_ShoppingCart"];
}
CartView = new DataView(Cart);
ShoppingCart.DataSource = CartView;
CartView.Sort="Item";
MyDataGrid.DataSource = CreateDataSource();
if (!Page.IsPostBack)
{
ShoppingCart.DataBind();
MyDataGrid.DataBind();
}
}
void Grid_CartCommand(object sender, DataGridCommandEventArgs e) {
DataRow dr = Cart.NewRow();
// e.Item is the row of the table where the command fired
// For bound columns the value is stored in the Text property of TableCell
TableCell itemCell = e.Item.Cells[1];
TableCell priceCell = e.Item.Cells[2];
string item = itemCell.Text;
string price = priceCell.Text;
if (e.CommandName == "AddToCart") {
dr[0] = item;
dr[1] = price;
Cart.Rows.Add(dr);
}
else { //Remove from Cart
CartView.RowFilter = "Item='"+item+"'";
if (CartView.Count > 0) {
CartView.Delete(0);
}
CartView.RowFilter = "";
}
ShoppingCart.DataBind();
}
</script>
<body>
<font face="Verdana">Using a Template Column in DataGrid</h3>
<form id="Form1" runat="server">
<table cellPadding="5">
<tr vAlign="top">
<b>Product List</b>
<asp:datagrid id="MyDataGrid" runat="server" OnItemCommand="Grid_CartCommand" AutoGenerateColumns="False"
HeaderStyle-BackColor="#aaaadd" Font-Size="8pt" Font-Name="Verdana" CellPadding="3" BorderWidth="1px"
BorderColor="Black" Font-Names="Verdana">
</HeaderStyle BackColor="#AAAADD">
<Columns>
</asp:ButtonColumn Text="Select" ButtonType="PushButton" HeaderText="Select" CommandName="AddToCart">
</asp:BoundColumn DataField="StringValue" HeaderText="Item">
<asp:BoundColumn DataField="CurrencyValue" HeaderText="Price" DataFormatString="{0:c}">
</ItemStyle HorizontalAlign="Right">
</asp:BoundColumn>
<asp:TemplateColumn HeaderText="Assembly required?">
<ItemTemplate>
<asp:CheckBox ID=Chk1 Checked='<%# DataBinder.Eval(Container.DataItem, "BoolValue") %>' Enabled="false" runat="server" />
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</td>
<b>Shopping Cart</b>
</td id="ShoppingCart" runat="server" HeaderStyle-BackColor="#aaaadd" Font-Size="8pt"
Font-Name="Verdana" CellPadding="3" BorderWidth="1" BorderColor="black">
</tr>
</table>
</form>
</body>
</HTML>
MSc Konstantinos Pantos
MCP Software Engineer
http://blog.pantos.name
http://kostas.pantos.name