asp.net C#中的网格视图使用问题

本文关键字:视图 问题 网格 net asp | 更新日期: 2023-09-27 17:59:12

我想用一个HyperLink和另外两个字段填充GridView

我三心二意地尝试了下面的方法。它给出了错误。

SqlCommand comm = new SqlCommand(
    @"Select 
        FileUpload.FileName AS FileName,
        FileUpload.FilePath AS PATH,
        SubjectMaster.SubjectName AS Subject,
        MemberPersonalInformation.FirstName As SharedBy 
    from FileUpload 
    INNER JOIN ContentManagement 
        ON ContentManagement.FileId=FileUpload.FileId  
    INNER JOIN MemberPersonalInformation 
        ON MemberPersonalInformation.MemberId=ContentManagement.CreatedBy 
    INNER JOIN SubjectMaster 
        ON ContentManagement.SubjectName=SubjectMaster.SubjectId  
    where 
        FileUpload.FileId in
        (
            Select FileId 
            from ContentManagement 
            where 
                ContentId in
                (
                    Select ContentId 
                    from ContentToIndividual 
                    where ShowToMemberId=@MemberId
                ) and 
                ContentManagement.ContentTypeId=@TPD and
                ContentManagement.SessionId=@SessionId
        )", conn);
      conn.Open();
        SqlDataReader rdr = comm.ExecuteReader();
        int i = 0;
        while (rdr.Read())
        {
            string fip = rdr["PATH"].ToString();
            GridViewRow di = GridView1.Rows[i];
                HyperLink h1 = (HyperLink)di.FindControl("Hyperlink1");
                h1.Text = rdr["FileName"].ToString();
                h1.NavigateUrl = "download.aspx?filepath=" + fip;
                di.Cells[1].Text = rdr["SharedBy"].ToString();
                di.Cells[2].Text = rdr["Subject"].ToString();
                i++;
        }
        rdr.Close();

正在获取错误消息

索引超出范围。必须是非阴性且小于收藏
参数名称:索引

如果有人建议我一个更好的方法来做这件事或纠正这个错误,请。

asp.net C#中的网格视图使用问题

确保您的网格视图至少有三个,否则这一行将抛出您描述的异常:

di.Cells[2].Text = rdr["SharedBy"].ToString();

另一方面,你需要小心这一行:

 h1.NavigateUrl = "download.aspx?filepath=" + fip;

将路径传递到客户端,然后再传递回服务器是引入安全问题的好方法,请确保download.aspx检查filepath参数是否指向真正应该下载的文件!!:)

GridView.Rows集合索引是基于零的。您需要使用初始化i

i变量的值超过GridView.Rows集合中的可用索引时,会发生错误。因此,如果用zero初始化i变量并不能解决问题,那么返回的结果集(由读取器读取)比GridView.Rows集合包含更多的项。

要确保i变量的值不超过GridView.Rows集合的可用索引,请使用以下内容:

while (rdr.Read() && i < gridView.Rows.Count)

如果您需要在GridView中添加行,则使用以下方法:

while (rdr.Read() && i < 3)
{
    string fip = rdr["PATH"].ToString();
    GridViewRow di = new GridViewRow();
    ....
    gridView.Rows.Add(di);        
    i++;        
}

另一个原因可能是用于引用GridViewRow.Cells中的项的索引。

设置int i=0;和检查,索引从0开始,而不是从1 开始

我认为您的阅读器集合计数与网格行计数的大小不匹配,这就是为什么它给出"索引超出范围"的原因检查

if(GridView1.Rows.Count  > i)

然后执行您想要的