Anoushka Seechurn
Anoushka Seechurn

Reputation: 2256

Index out of range c# datagridview

I am trying to display the result of an SQL query into a datagridview as follows:

SqlCommand cmd;
SqlDataReader reader_;
SqlConnection ccs = new SqlConnection(MainForm._constR.ToString());

string strSQL_ = "SELECT cp.CouponNumber as cpn, cp.StopOverCode as xo, cp.ReservationBookingDesignator as RBD, cp.Carrier as carrier, cp.FlightNumber as flightNum, cp.UsedClassofService as class_of_service, cp.FlightDepartureDate as f_d_d, cp.FlightDepartureTime as f_d_t,  cp.CouponStatus as cp_stat, cp.FareBasisTicketDesignator as farebasis,  cp.NotValidBefore as val_bef,  cp.NotValidAfter as val_aft,  cp.FreeBaggageAllowance as free_bag_allow,  cp.FlightBookingStatus as f_booking_stat, cp.OriginAirportCityCode+'/'+cp.DestinationAirportCityCode as GFPA,cp.UsageOriginCode +'/'+ cp.UsageDestinationCode as usg_sector,  cp.UsageAirline as usg_airline,  cp.UsageDate as usg_date,  cp.UsageFlightNumber as usg_f_num,  cp.FrequentFlyerReference as FFP  FROM [Biatss_PC].[Pax].[SalesDocumentCoupon] as cp  JOIN [Biatss_PC].[Pax].[SalesDocumentHeader] as h on h.DocumentNumber = cp.DocumentNumber  WHERE h.DocumentNumber = '2581806273'  ";//document number to be parsed
//objCmd = new OleDbCommand(strSQL, objConnection);
cmd = ccs.CreateCommand();
ccs.Open();
cmd.CommandText = strSQL_;
reader_ = cmd.ExecuteReader();

int r_ = 0;
int c_ = 0;

if (reader_.HasRows)
    {

        while (reader_.Read())
        {

            dbgCPNlist.Rows[r_].Cells[c_].Value =  reader_["cpn"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["xo"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["GFPA"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["carrier"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["flightNum"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["class_of_service"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["f_d_d"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["f_d_t"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["cp_stat"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["farebasis"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["val_bef"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["val_aft"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["free_bag_allow"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["f_booking_stat"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["RBD"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["usg_sector"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["usg_airline"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["usg_f_num"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["usg_date"].ToString();
            c_++;

            dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["FFP"].ToString();
            c_++;

            //so as to be able to start at column-index zero for next row
            c_ = 0;
            r_++;

        }
        ccs.Close();
    }

However when I run the code, I get an error where the first row's column is to be inserted saying

Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

What did I do wrong ?

Upvotes: 2

Views: 1163

Answers (3)

Chris
Chris

Reputation: 8647

You populate the datagridview by reading a DataReader. In this case, you need to explicitly add the rows to the datagridview. You currently try to access a row that doesn't exist yet.

Suppose datagridview is empty when you start the loop. Just add:

while (reader_.Read())
            {
            dbgCPNlist.Rows.Add();
            ...

Upvotes: 3

Vanest
Vanest

Reputation: 916

            while (reader_.Read())
            {
                dbgCPNlist.Rows.Add();
                dbgCPNlist.Rows[r_].Cells[c_].Value =  reader_["cpn"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["xo"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["GFPA"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["carrier"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["flightNum"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["class_of_service"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["f_d_d"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["f_d_t"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["cp_stat"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["farebasis"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["val_bef"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["val_aft"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["free_bag_allow"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["f_booking_stat"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["RBD"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["usg_sector"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["usg_airline"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["usg_f_num"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["usg_date"].ToString();
                c_++;

                dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["FFP"].ToString();
                c_++;

                //so as to be able to start at column-index zero for next row
                c_ = 0;
                r_++;



            }
            ccs.Close();

Upvotes: 1

Damith
Damith

Reputation: 63105

Crhis Answered Why this error, but why you doing in this way?

You can get DataTable by using SqlDataAdapter and bind it directly to the GridView as below

using(var conn = new SqlConnection(connString))
{
    conn.Open();
    var command = new SqlCommand(sqlstring, conn);
    var adapter = new SqlDataAdapter(command);
    DataTable dt = new DataTable();
    adapter.Fill(dt);
    dbgCPNlist.DataSource = dt;
    dbgCPNlist.DataBind();
}

Upvotes: 1

Related Questions