4

我正在尝试将 pdf 从我的数据库中带到我的 gridview 并允许用户单击它并下载 pdf。我正在尝试关注此处已解决的问题:

从 Gridview 的 BoundField 访问数据

但是,我收到以下错误:

Input string was not in a correct format.

这是我的 asp.net 代码:

     <Columns>
         <asp:CommandField ShowEditButton="True" ControlStyle-CssClass="savefile"/>
         <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" 
             ReadOnly="True" SortExpression="ID" />
         <asp:BoundField DataField="event_name" HeaderText="event_name" 
             SortExpression="event_name" />

         <asp:TemplateField HeaderText="PDF">

   <ItemTemplate>
       <asp:Button ID="Button1" ButtonType="Link" CommandName="DownloadFile" HeaderText="Download"  runat="server" Text="Button" />


    </ItemTemplate>

   <EditItemTemplate>

       <asp:FileUpload ID="FileUpload1" runat="server" /> // shown only in edit mode

   </EditItemTemplate>

  </asp:TemplateField>

     </Columns>
 </asp:GridView>

和相应的c#代码:

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {

    if (e.CommandName == "DownloadFile")
    {


        int index = Convert.ToInt32(e.CommandArgument);
        string id = GridView1.DataKeys[index].Value.ToString();
        SqlConnection con = new SqlConnection(strcon);
        string command = "Select pdf from table where id = @id";
        SqlCommand cmd = new SqlCommand(command, con);

        cmd.Parameters.AddWithValue(id, "id");
        SqlDataReader reader = cmd.ExecuteReader();
        reader.Read();
        Response.Clear();
        Response.ContentType = "application/pdf";
        Response.BinaryWrite((Byte[])reader[0]);

        Response.Flush();

        Response.End(); 
    }

}

我的 c# 代码中的错误行是这样的:

int index = Convert.ToInt32(e.CommandArgument);

提前感谢您的帮助!

编辑 - - - - - - - - - - - - - - - - - - - - - - - - - -

我的按钮字段现在看起来像这样:

<asp:Button ID="Button1" ButtonType="Link" CommandName="DownloadFile" CommandArgument='<%#Container.DataItemIndex%>' HeaderText="Download"  runat="server" Text="Button" />

和我的 c# 错误代码行:

int index = Convert.ToInt32(e.CommandArgument);

我仍然收到同样的错误。

4

2 回答 2

4

您没有指定CommandArgument. 因此,您的错误正在发生,因为您试图将空白字符串转换为整数。

将行索引添加为您的CommandArgument

尝试将此添加到您的Button控件中:

<asp:Button ID="Button1"
            ButtonType="Link"
            CommandName="DownloadFile"
            CommandArgument='<%#Container.DataItemIndex%>'
            HeaderText="Download"
            runat="server"
            Text="Button" />
于 2012-08-06T15:39:25.353 回答
3

您不是在为它们分配值,CommandArgument而是在访问它们,RowCommand这是导致错误的原因。

 <asp:Button ID="Button1" ButtonType="Link" CommandName="DownloadFile" HeaderText="Download"  runat="server" Text="Button" CommandArgument="1" />

正如@Curt 所说,您可以将硬编码的 CommandArgument 值替换为绑定值。

CommandArgument='<%#eval("DataField")'

使用 ToString

int index = Convert.ToInt32(e.CommandArgument.ToString());
于 2012-08-06T15:41:05.917 回答