I display customers past orders in a gridview. They can press the Resend button in the last column to resend their order under the condition that the order is paid or past that status.
First the gridview:
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" BackColor="White" pagesize="10"
BorderColor="#999999" BorderStyle="None" BorderWidth="1px" CellPadding="3" DataSourceID="SqlDataSource1" EmptyDataText="You have no orders yet"
GridLines="Vertical" OnRowCommand="GridView1_RowCommand">
<AlternatingRowStyle BackColor="#DCDCDC"/>
<Columns>
<asp:BoundField DataField="TD_OrdID" HeaderText="Ord" InsertVisible="False" ReadOnly="True" SortExpression="TD_OrdID" />
<asp:BoundField DataField="TD_OrdDate" DataFormatString="{0:d}" ItemStyle-HorizontalAlign="Right" HeaderText="Date" SortExpression="TD_OrdDate" ><ItemStyle HorizontalAlign="Right"></ItemStyle></asp:BoundField>
<asp:BoundField DataField="TD_PD_PackageName" HeaderText="Package Name" ItemStyle-HorizontalAlign="Left" SortExpression="TD_PD_PackageName" > </asp:BoundField>
<asp:BoundField DataField="TD_OSName" ItemStyle-HorizontalAlign="Right" HeaderText="Status" SortExpression="TD_OSName" > <ItemStyle HorizontalAlign="Right"></ItemStyle></asp:BoundField>
<asp:BoundField DataField="TD_InvID" HeaderText="Inv" InsertVisible="False" ReadOnly="True" SortExpression="TD_InvID" />
<asp:BoundField DataField="TD_InvPaid" HeaderText="Paid" ItemStyle-HorizontalAlign="Right" SortExpression="TD_InvPaid" ><ItemStyle HorizontalAlign="Right"></ItemStyle></asp:BoundField>
<asp:TemplateField>
<ItemTemplate>
<asp:Button runat="server" ID="btnResend" CommandName="Resend" Text="Resend" CommandArgument="<% ((GridViewRow) Container).RowIndex
%>" OnDataBinding="btnResend_DataBinding" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
<FooterStyle BackColor="#CCCCCC" ForeColor="Black" />
<HeaderStyle BackColor="#000084" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
<RowStyle BackColor="#EEEEEE" ForeColor="Black" Font-Size="Small" HorizontalAlign="Center"/>
<SelectedRowStyle BackColor="#008A8C" Font-Bold="True" ForeColor="White" />
<SortedAscendingCellStyle BackColor="#F1F1F1" />
<SortedAscendingHeaderStyle BackColor="#0000A9" />
<SortedDescendingCellStyle BackColor="#CAC9C9" />
<SortedDescendingHeaderStyle BackColor="#000065" />
</asp:GridView>
now the databinding to select the resend button when customer paid the order:
protected void btnResend_DataBinding(object sender, EventArgs e)
{
// only set button to enable when customer can resend document!
Button btn = (Button)(sender);
// enable button for status emailed, paid and closed
btn.Enabled = ((Eval("TD_OSName").ToString().Equals("closed")) ||
(Eval("TD_OSName").ToString().Equals("paid")) ||
(Eval("TD_OSName").ToString().Equals("emailed")));
}
which works fine. I am disabling the button. Maybe a better solution is to hide it instead. However this is not my concern.
now the row command to get the "ordId" value from the row where the button is pressed:
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Resend")
{
// Retrieve the row index stored in the
// CommandArgument Property
int index = Convert.ToInt32(e.CommandArgument);
// Retrieve the row that contains the button
// from Rows collection.
GridViewRow row = GridView1.Rows[index];
// add code
int ordId = Convert.ToInt32(row.Cells[0].Text);
lblMessage.ForeColor = System.Drawing.Color.Green;
//lblMessage.Text = displayMessages.YourDocumentResent() + "OrdID:" + ordId;
//lblMessage.Text = displayMessages.YourDocumentResent();
lblMessage.Text = Convert.ToString(e.CommandArgument);
}
}
However to get the selected row and reading out the order identification from the row is challenging for me. I goggled this over and over and can’t see where I make the mistake.
The line:
int index = Convert.ToInt32(e.CommandArgument)
fails with
Input string was not in a correct format
If found this even on the msdn page of Microsoft?!
If I display the e.commandArgument
I see: <% ((GridViewRow) Container).RowIndex %>
Can anyone help so I can get the value OrdId
from TD_OrdID
from the row the customer has pressed the Resend button?
Thank you in advance.