Проблема с использованием вида сетки в asp.net C # - PullRequest
1 голос
/ 16 июня 2011

Я хочу заполнить GridView HyperLink и другими двумя другими полями.

Я попытался с нижеприведенным подходом наполовину от души.Это дает ошибки.

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 ]

1 голос
/ 16 июня 2011

Убедитесь, что в вашем сеточном представлении есть как минимум три столбца , в противном случае эта строка выдаст исключение, которое вы описываете:

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

В другой заметке вам нужно быть осторожным с этимстрока:

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

Передача путей клиенту, а затем обратно на сервер - это хороший способ создать проблемы с безопасностью, убедитесь, что download.aspx проверяет параметр filepath для файла, который действительно должен быть загружаемым!!:)

1 голос
/ 16 июня 2011

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.

0 голосов
/ 16 июня 2011

Я думаю, что количество ваших читателей не соответствует размеру строки сетки, поэтому оно дает "Индекс был вне диапазона". Проверьте это. Сделайте проверку

if(GridView1.Rows.Count  > i)

, а затем выполните эту операцию, которую выхочет

0 голосов
/ 16 июня 2011

Установить int i = 0; и проверьте, индекс начинается с 0, а не 1

...