0

gridview のダウンロード ボタンをクリックすると、次のエラーが表示されます。 Index was out of range. 負ではなく、コレクションのサイズより小さくなければなりません。パラメータ名: index my aspx code is

<asp:GridView ID ="gvDetails" runat ="server" AutoGenerateColumns="False" >
<Columns >
<asp:BoundField DataField ="auto_id" ReadOnly ="True" HeaderText="Sr No." />
<asp:BoundField DataField ="topic_name" ReadOnly ="True" HeaderText ="Announcement" />
<asp:TemplateField HeaderText ="File Path">
<ItemTemplate >
<asp:LinkButton ID ="lnkDownload" runat ="server" Text="Download" OnClick="lnkDownload_Click" ></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

my code for downloading is 
protected void lnkDownload_Click(object sender, EventArgs e)
{
try
{
LinkButton lnkbtn = sender as LinkButton;
GridViewRow gvrow = lnkbtn.NamingContainer as GridViewRow;
int field = Convert.ToInt32(gvDetails.DataKeys[gvrow.RowIndex].Value .ToString ());
SqlDataReader dr = MclsAssignment.getDownload(field);
if (dr.Read())
{
Response.AddHeader("Content-Disposition", "attachment;filename=\"" + dr["mfile_name"] + "\"");
Response.BinaryWrite((byte[])dr["file_data"]);
Response.End();
}
}
catch (Exception)
{       
throw;
}
}
4

4 に答える 4

0
<asp:LinkButton ID ="lnkDownload" runat ="server" Text="Download" RowIndex='<%# Container.DisplayIndex %>' OnClick="lnkDownload_Click" ></asp:LinkButton>


---------------------------------------------------------------
int field = Convert.ToInt32(lnkbtn.Attributes["RowIndex"]);

これでrowIndexが取得されることを願っていますただし、問題に直面するまでは、質問を詳しく説明し、エラーが発生している場所を正確に教えてください??

ただし、コマンド イベントを使用するとより効率的になります。

于 2013-08-12T08:59:17.663 に答える
0

行が選択されていない場合、例外が発生します。したがって、次のことを確認する必要があります。

gvrow.RowIndex

は -1 より大きいです。

protected void lnkDownload_Click(object sender, EventArgs e)
{
  try
  {
    if(gvrow.RowIndex < 0)   //return if user hasn't selected any row
        return;
    LinkButton lnkbtn = sender as LinkButton;
    GridViewRow gvrow = lnkbtn.NamingContainer as GridViewRow;
    int field = Convert.ToInt32(gvDetails.DataKeys[gvrow.RowIndex].Value .ToString ());
    SqlDataReader dr = MclsAssignment.getDownload(field);
    if (dr.Read())
    {
      Response.AddHeader("Content-Disposition", "attachment;filename=\"" + dr["mfile_name"] + "\"");
      Response.BinaryWrite((byte[])dr["file_data"]);
      Response.End();
     }
  }
  catch (Exception)
  {       
     throw;
   }
}
于 2013-08-12T08:48:57.877 に答える
0

あなたの質問に対する最も簡単な解決策であるRow Commandイベントを試してください

<asp:GridView ID ="gvDetails" runat ="server" AutoGenerateColumns="False" >
<Columns >
  <asp:BoundField DataField ="auto_id" ReadOnly ="True" HeaderText="Sr No." />
  <asp:BoundField DataField ="topic_name" ReadOnly ="True" HeaderText ="Announcement" />
  <asp:TemplateField HeaderText ="File Path">
    <ItemTemplate >
      <asp:LinkButton ID ="lnkDownload" runat ="server" Text="Download"   CommandName="Download"  CommandArgument='<%#Eval("YourID") %>'></asp:LinkButton>
    </ItemTemplate>
  </asp:TemplateField>    
</Columns>
</asp:GridView>




protected void gvDetails_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName.ToLower() == "application")
    {

          // write your code
    }
}
于 2013-08-12T11:30:37.730 に答える
0

-1 の gvRow.RowIndex を確認する必要があると思います。ユーザーがグリッドビューで行を選択しなかった場合、例外が発生します。

于 2013-08-12T08:49:48.833 に答える