R.M49 Ответов: 2

Дублирование строк Gridview C#


Привет,

У меня есть веб-страница, которая позволяет студенту регистрировать курсы, и я хочу отобразить сообщение об ошибке, если студент выберет курс, который был пройден ранее и уже находится в gridview.

Все в коде работает нормально,но когда я использую этот цикл
for (int i = 0; i < GridView1.Rows.Count;i++)
код проверяет только первую строку.


Как я могу заставить цикл for пройти через все строки gridview

Что я уже пробовал:

protected void Button1_Click(object sender, EventArgs e)
        {

            for (int i = 0; i < GridView1.Rows.Count;i++)
            {

             if (GridView1.Rows[i].Cells[4].Text == DropDownList2.SelectedValue.ToString())
                {

                    //display error message.
                }
                else
                {
                    string stid = Label1.Text;
                    string coursecode = DropDownList2.SelectedValue.ToString();
                    string docid = lblDocID.Text;
                    string semester = lblSemester.Text;
                    string sessiondays = lblSessionDays.Text;
                    string days = lblDays.Text;
                    string timing = lblTiming.Text;
                    string startid = lblStartTime.Text;
                    string endtime = lblEndTime.Text;
                    string roomid = lblRoomID.Text;


                    SqlConnection ConnString = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
              String query = "insert into Registration values (@St_ID, @Semester, @CourseCode, @Doc_ID, @SessionDays, @Days, @Timing, @StartTime, @EndTime, @RoomID)";
                    SqlCommand cmd = new SqlCommand(query);

                    cmd.Connection = ConnString;
                    cmd.Parameters.AddWithValue("@St_ID", stid);
                    cmd.Parameters.AddWithValue("@Semester", semester);
                    cmd.Parameters.AddWithValue("@CourseCode", coursecode);
                    cmd.Parameters.AddWithValue("@Doc_ID", docid);
                    cmd.Parameters.AddWithValue("@SessionDays", sessiondays);
                    cmd.Parameters.AddWithValue("@Days", days);
                    cmd.Parameters.AddWithValue("@Timing", timing);
                    cmd.Parameters.AddWithValue("@StartTime", startid);
                    cmd.Parameters.AddWithValue("@EndTime", endtime);
                    cmd.Parameters.AddWithValue("@RoomID", roomid);
                    ConnString.Open();
                    cmd.ExecuteNonQuery();
                    ConnString.Close();

                    Response.Redirect("~/StudentAddDropCourse.aspx");

                }
            }
     }

Angelo L

Используя отладчик, вы проверили строки, которые сравниваете в операторе if, GridView1. Rows[i].Клетки[4].Текст и DropDownList2.SelectedValue.Метод toString()?

R.M49

да, проблема в том, что цикл for проверяет только первую строку, он не проходит через все строки.

Angelo L

Мне кажется, что ваш код добавляет данные каждый раз, когда сравнение терпит неудачу внутри цикла, но поскольку вы не прерываете цикл, вы продолжаете итерацию. Для оператора if после отображения сообщения об ошибке вы должны прерваться, чтобы выйти из цикла for. Вы не должны делать оператор else, если вы уже не просмотрели все строки, то есть вы перебрали их и не вошли в Оператор if и не сломались. Поэтому измените else на что-то вроде 'else if (i == GridView1.Rows.Граф-1)".

R.M49

ууууу, теперь он работает, не могли бы вы написать его как soultion, чтобы я мог принять его.

Angelo L

Рад был помочь.

2 Ответов

Рейтинг:
8

Angelo L

Мне кажется, что ваш код добавляет данные каждый раз, когда сравнение терпит неудачу внутри цикла, но поскольку вы не прерываете цикл, вы продолжаете итерацию. Для оператора if после отображения сообщения об ошибке вы должны прерваться, чтобы выйти из цикла for. Вы не должны делать оператор else, если вы уже не просмотрели все строки, то есть вы перебрали их и не вошли в Оператор if и не сломались. Поэтому измените else на что-то вроде 'else if (i == GridView1.Rows.Граф-1)".

//condition changed to <= to account for empty grid, count = 0
for (int i = 0; i <= GridView1.Rows.Count;i++)
{
//Check row count first, if it is 0 then the other contidtions are not checked, go to else if.
    if ((GridView1.Rows.Count != 0) && 
        (GridView1.Rows[i].Cells[4].Text == DropDownList2.SelectedValue.ToString()))
    {
        //display error message.
        break;
    }
//If the grid is empty, add data and break out of the loop. If end of the rows and no match found, add data and break out of the loop.
    else if ((GridView1.Rows.Count == 0) || (i == GridView1.Rows.Count - 1))
    {
        //your stuff here.
        break;  // added break so i still less than count when we exit
    }
}


R.M49

Что делать, если таблица, привязанная к gridview, пуста ?? в gridview не будет строк, так как же будет работать цикл ?

Angelo L

Я обновил решение. Проверьте мои комментарии о том, что я сделал.

R.M49

- Спасибо тебе.

Рейтинг:
2

Vinod Jangle

Вы можете найти это какое-то длинное решение и иметь место для рефакторинга, но вы можете попробовать следующее решение -

protected void Button1_Click(object sender, EventArgs e)
{
    var dataSource = GridView1.DataSource as DataTable;

    //Get all cources
    List<string> cources = new List<string>();
    foreach (DataRow row in dataSource.Rows)
    {
        //put your column details here
        cources.Add(row.ItemArray[1].ToString());
    }

    //Check if course already selected and avail in grid
    string SelectedCource = cources.Distinct().FirstOrDefault(m => m.Equals("<USERSELECTEDCOURCE>"));

    if(!String.IsNullOrEmpty(SelectedCource))
    {
        //error
    }
    else
    {
        //whatever you want to do to new selected cource
    }
}