【问题标题】:Index out of range c# datagridview索引超出范围 c# datagridview
【发布时间】:2013-09-20 09:41:06
【问题描述】:

我正在尝试将 SQL 查询的结果显示到 datagridview 中,如下所示:

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

但是当我运行代码时,我得到一个错误,第一行的列要插入说

索引超出范围。必须是非负数且小于 集合。参数名称:索引

我做错了什么?

【问题讨论】:

  • 我喜欢挑战,但是哪一行会报错?
  • dbgCPNlist.Rows[r_].Cells[c_].Value = reader_["cpn"].ToString();这条线。

标签: c# winforms datagridview


【解决方案1】:

您通过读取DataReader 来填充datagridview。在这种情况下,您需要将行显式添加到datagridview。您当前尝试访问尚不存在的行。

假设您启动循环时datagridview 为空。只需添加:

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

【讨论】:

    【解决方案2】:

    Crhis 回答了为什么会出现这个错误,但是为什么你会这样做呢?

    您可以使用SqlDataAdapter 获取DataTable 并将其直接绑定到GridView,如下所示

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

    【讨论】:

    • 不完全是因为变量在sql中的方式在datagridview的列顺序中顺序不同。
    • 那么你可以在select语句中改变顺序
    【解决方案3】:
                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();
    

    【讨论】:

      猜你喜欢
      • 2018-12-14
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      相关资源
      最近更新 更多