Как загрузить файл из указанной строки c в GridView - PullRequest
1 голос
/ 27 января 2020

Мне нужна помощь с загрузкой файла в указанной строке c в моем GridView.

Это мой код для разметки GridView:

 <asp:GridView ID="GridView1" runat="server" 
                       AutoGenerateColumns="False"
                       DataKeyNames="id" 
                       CssClass="mydatagrid" 
                       Width="550px" 
                       BackColor="#DEBA84" 
                       BorderColor="#DEBA84" 
                       BorderStyle="None" 
                       BorderWidth="1px" 
                       CellPadding="3" 
                       CellSpacing="2" 
                       AllowSorting="true">
                    <Columns>
                          <asp:BoundField DataField="filename" HeaderText="Name" />
                          <asp:BoundField DataField="datestamp" HeaderText="Date" />
                          <asp:TemplateField ShowHeader="False">
                        <ItemTemplate>
                         <asp:Button ID="Button1" runat="server" 
                                            Text="Download" 
                                            ControlStyle-CssClass="btn btn-success" 
                                            CommandName="MyCommand" CommandArgument='<%# DataBinder.Eval(Container, "RowIndex") %>'/>
                                    </ItemTemplate>
             </asp:TemplateField>
          </Columns>
      <FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" />
      <HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" width="250px" />
      <PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" />
      <RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" />
      <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" />
      <SortedAscendingCellStyle BackColor="#FFF1D4" />
      <SortedAscendingHeaderStyle BackColor="#B95C30" />
      <SortedDescendingCellStyle BackColor="#F1E5CE" />
      <SortedDescendingHeaderStyle BackColor="#93451F" />
  </asp:GridView>

И затем для загрузки файла, который у меня есть:

 protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName.Equals("MyCommand"))
    {
        int rowIndex = int.Parse(e.CommandArgument.ToString());
        string val = (string)this.GridView1.DataKeys[rowIndex]["id"];
        string strQuery = "SELECT filename, filecontent, datestamp FROM FileTable where id=@id";
        SqlCommand cmd = new SqlCommand(strQuery);
        cmd.Parameters.Add("@id", SqlDbType.Int).Value = 1;
        DataTable dt = GetData(cmd);
        if (dt != null)
        {
            download(dt);
        }
    }
}
private DataTable GetData(SqlCommand cmd)
{
    DataTable dt = new DataTable();
    String strConnString = System.Configuration.ConfigurationManager.ConnectionStrings["conString"].ConnectionString;
    SqlConnection con = new SqlConnection(strConnString);
    SqlDataAdapter sda = new SqlDataAdapter();
    cmd.CommandType = CommandType.Text;
    cmd.Connection = con;
    try
    {
        con.Open();
        sda.SelectCommand = cmd;
        sda.Fill(dt);
        return dt;
    }
    catch
    {
        return null;
    }
    finally
    {
        con.Close();
        sda.Dispose();
        con.Dispose();
    }
}
private void download (DataTable dt)
{
    Byte[] bytes = (Byte[])dt.Rows[0]["filecontent"];
    Response.Buffer = true;
    Response.Charset = "";
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.ContentType = dt.Rows[0]["filecontent"].ToString();
    Response.AddHeader("content-disposition", "attachment;filename="
    + dt.Rows[0]["filename"].ToString());
    Response.BinaryWrite(bytes);
    Response.Flush(); 
    Response.End();
}

Итак, что происходит сейчас, когда я нажимаю на загрузку, он всегда загружает файл первой строки вместо строки, на которую я нажал, чтобы загрузить.

Я знаю, что мне нужно указать строку, по которой я щелкнул, чтобы загрузить файл, но не уверен, как это сделать sh? 1013 *

Спасибо

1 Ответ

1 голос
/ 27 января 2020

Именно из-за этой строки

cmd.Parameters.Add("@id", SqlDbType.Int).Value = 1;

Затем вам нужно перейти от onclick к команде grid:

<asp:TemplateField>
    <ItemTemplate>
        <asp:Button ID="Button1" runat="server"Text="Download" 
                      ControlStyle-CssClass="btn btn-success" CommandName="MyCommand" CommandArgument='<%# DataBinder.Eval(Container, "RowIndex") %>'
    </ItemTemplate>
</asp:TemplateField>

И в вашем коде позади

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if(e.CommandName.Equals("MyCommand"))
    {
        int rowIndex = int.Parse(e.CommandArgument.ToString());
        string val = (string)this.grid.DataKeys[rowIndex]["id"];
        // you can run your query here
    }
}

В вашем случае:

 protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName.Equals("MyCommand"))
    {
        int rowIndex = int.Parse(e.CommandArgument.ToString());
        var val = this.GridView1.DataKeys[rowIndex]["id"];
        string strQuery = "SELECT filename, filecontent, datestamp FROM FileTable where id=@id";
        SqlCommand cmd = new SqlCommand(strQuery);
        cmd.Parameters.Add("@id", SqlDbType.Int).Value = val;
        DataTable dt = GetData(cmd);
        if (dt != null)
        {
            download(dt);
        }
    }
}

Вам также необходимо добавить onrowcommand="ContactsGridView_RowCommand" к вашему Gridview

<asp:GridView ID="GridView1" runat="server" onrowcommand="ContactsGridView_RowCommand"
...