1

GridViewaHyperLinkと他の 2 つのフィールドを入力したいと思います。

私は以下のアプローチで中途半端に試しました。エラーが発生しています。

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();

エラーメッセージの取得

インデックスが範囲外でした。負ではなく、コレクションのサイズより小さくなければなりません。
パラメータ名:インデックス

誰かがこれを行うためのより良い方法を提案するか、このエラーを修正してください。

4

4 に答える 4

1

グリッドビューに少なくとも 3 つの列があることを確認してください。そうしないと、この行で説明した例外がスローされます。

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

別の注意として、次の行には注意する必要があります。

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

パスをクライアントに渡してからサーバーに戻すことは、セキュリティ上の問題を引き起こす良い方法です。download.aspx で filepath パラメータが本当にダウンロード可能なファイルであることを確認してください!! :)

于 2011-06-16T06:42:02.900 に答える
1

GridView.Rowsコレクションのインデックスはゼロから始まります。iゼロで初期化する必要があります。

このエラーは、i変数の値がGridView.Rowsコレクション内の使用可能なインデックスを超えた場合に発生します。したがって、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

于 2011-06-16T06:15:34.140 に答える
0

int i = 0 に設定します。そしてチェック、インデックスは1ではなく0から始まります

于 2011-06-16T06:17:17.180 に答える
0

あなたのリーダーコレクション数がグリッド行数のサイズと一致していないと思うので、「インデックスが範囲外でした」というメッセージが表示されます これを確認してください

if(GridView1.Rows.Count  > i)

この後、あなたが望むものを実行します

于 2011-06-16T06:48:56.487 に答える