1

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.

4

1 回答 1

1
<% ((GridViewRow) Container).RowIndex %>

You're missing the #.

Try:

<%# ((GridViewRow) Container).RowIndex %>
于 2015-02-04T03:20:07.243 回答