Kerem Aygül
Kerem Aygül

Reputation: 25

c# asp.net Index was out of range. when I trying to select a row

I have a gridview on my page. And I have 2 snippets of SQL code to binds that gridview.

First one is run on page load. If there are records returned from the first SQL, I can select a row on gridview.

But the problem is when there is no record returned from the first SQL, I have button that runs another SQL and binds its result to the gridview too. But when I try to select a row, I get this error:

Index was out of range. when I trying to select a row Must be non-negative and less than the size of the collection. Parameter name: index

My code is like that

First SQL (its run on page load)

void listele()
{
    baglanti.Open();
    MySqlCommand cmd = new MySqlCommand("SELECT * From kayitlar where durum='Çözülmedi' or durum='İşlem Yapılıyor'", baglanti);
    DataTable dataTable = new DataTable();
    MySqlDataAdapter da = new MySqlDataAdapter(cmd);

    da.Fill(dataTable);


    GridView1.DataSource = dataTable;
    GridView1.DataBind();
    baglanti.Close();
}

and thats the second SQL that when runs when I click button

void listelehepsi()
{
    baglanti.Open();
    MySqlCommand cmd = new MySqlCommand("SELECT * From kayitlar", baglanti);
    DataTable dataTable = new DataTable();
    MySqlDataAdapter da = new MySqlDataAdapter(cmd);

    da.Fill(dataTable);


    GridView1.DataSource = dataTable;
    GridView1.DataBind();
    baglanti.Close();
}

and this is the GridView1_SelectedIndexChanged event

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
    int secili;
    secili = GridView1.SelectedIndex;
    GridViewRow row = GridView1.Rows[secili]; // I GOT ERROR HERE
    TextBox1.Text = row.Cells[1].Text;
}

why Am I getting this error ?

EDIT-- I got solve changing the page load sql like this;

void listele()
{
    baglanti.Open();
    MySqlCommand cmd = new MySqlCommand("SELECT * From kayitlar where durum='Çözülmedi' or durum='İşlem Yapılıyor'", baglanti);
    DataTable dataTable = new DataTable();
    MySqlDataAdapter da = new MySqlDataAdapter(cmd);

    da.Fill(dataTable);


    GridView1.DataSource = dataTable;
    if (!IsPostBack)
    {
        GridView1.DataBind();
    }
    else
    {
        //
    }
    baglanti.Close();
}

Upvotes: 1

Views: 187

Answers (2)

BigColdMartini
BigColdMartini

Reputation: 11

In the GridView1_SelectedIndexChanged event, could you simply do a RowCount to see if the value is != 0 before the other code runs?

if (GridView1.RowCount <= 0)
{
    return;
} 

Upvotes: 0

FJT
FJT

Reputation: 2083

Make sure that you are not rebinding your datagrid on postback - you can do this in your PageLoad event - something like

if (!IsPostback)
{
   ... bind your datagrid
}

Upvotes: 1

Related Questions