Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在从gridview下载时查找数据键值_C#_Asp.net - Fatal编程技术网

C# 如何在从gridview下载时查找数据键值

C# 如何在从gridview下载时查找数据键值,c#,asp.net,C#,Asp.net,在gridvioew中单击下载按钮时,我遇到以下错误 索引超出范围。必须为非负数且小于集合的大小。 参数名称:索引 我的aspx代码是 <asp:GridView ID ="gvDetails" runat ="server" AutoGenerateColumns="False" > <Columns > <asp:BoundField DataField ="auto_id" ReadOnly ="True" HeaderText="Sr No." />

在gridvioew中单击下载按钮时,我遇到以下错误 索引超出范围。必须为非负数且小于集合的大小。 参数名称:索引 我的aspx代码是

<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;
}
}

我的下载代码是
受保护的无效lnkDownload_单击(对象发送方,事件参数e)
{
尝试
{
LinkButton lnkbtn=发送方为LinkButton;
GridViewRow gvrow=lnkbtn.NamingContainer作为GridViewRow;
int field=Convert.ToInt32(gvDetails.DataKeys[gvrow.RowIndex].Value.ToString());
SqlDataReader dr=MclsAssignment.getDownload(字段);
if(dr.Read())
{
AddHeader(“内容处置”、“附件;文件名=\”“+dr[“mfile\u name”]+“\”);
Response.BinaryWrite((字节[])dr[“file_data”]);
Response.End();
}
}
捕获(例外)
{       
投掷;
}
}

如果未选择任何行,则会出现异常。因此,您需要检查

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;
   }
}
protectedvoid lnkDownload_单击(对象发送方,事件参数e)
{
尝试
{
if(gvrow.RowIndex<0)//如果用户未选择任何行,则返回
返回;
LinkButton lnkbtn=发送方为LinkButton;
GridViewRow gvrow=lnkbtn.NamingContainer作为GridViewRow;
int field=Convert.ToInt32(gvDetails.DataKeys[gvrow.RowIndex].Value.ToString());
SqlDataReader dr=MclsAssignment.getDownload(字段);
if(dr.Read())
{
AddHeader(“内容处置”、“附件;文件名=\”“+dr[“mfile\u name”]+“\”);
Response.BinaryWrite((字节[])dr[“file_data”]);
Response.End();
}
}
捕获(例外)
{       
投掷;
}
}

我认为您必须检查gvRow.RowIndex中的-1。如果用户没有在gridview中选择一行,它将为您提供异常。


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


---------------------------------------------------------------
int field = Convert.ToInt32(lnkbtn.Attributes["RowIndex"]);
--------------------------------------------------------------- int field=Convert.ToInt32(lnkbtn.Attributes[“RowIndex]”);
希望这能让你明白,但是如果你还没有遇到问题,请详细说明你的问题,并告诉你到底哪里出了错


不过,使用命令事件会更有效。

请尝试使用行命令事件,这是解决您问题的最简单方法

范例


受保护的void gvDetails_row命令(对象发送方,GridViewCommandEventArgs e)
{
如果(例如,CommandName.ToLower()=“应用程序”)
{
//编写代码
}
}

我在以下行代码中遇到错误:int field=Convert.ToInt32(gvDetails.DataKeys[gvrow.RowIndex].Value.ToString())gvrow.RowIndex的值是多少?选择gridview后,gvrow.RowIndex的值是1 gridview的索引中是否有任何datakey?在gridview中添加datakeyname后,您尚未在gridview中指定任何datakeyname错误已解决,但“在关闭读卡器时调用Read的尝试无效。”新的错误来了…我在这里使用三层架构…而且我在任何地方都没有关闭连接
<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
    }
}