c#asp.net索引超出范围。当我尝试选择一行时

时间:2018-03-26 20:01:36

标签: c# sql asp.net

我的网页上有一个gridview。我有2个SQL代码片段来绑定gridview。

第一个是在页面加载时运行。如果有第一个SQL返回的记录,我可以在gridview上选择一行。

但问题是当第一个SQL没有返回记录时,我有一个运行另一个SQL的按钮,并将其结果绑定到gridview。但是当我尝试选择一行时,我收到了这个错误:

  

指数超出范围。当我尝试选择一行时必须是非负的且小于集合的大小。参数名称:index

我的代码就是那样

第一个SQL(在页面加载时运行)

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

那就是当我点击按钮时运行的第二个SQL

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

这是GridView1_SelectedIndexChanged事件

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

为什么我收到此错误?

EDIT-- 我解决了像这样更改页面加载sql的问题;

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

2 个答案:

答案 0 :(得分:1)

确保您没有在回发时重新绑定数据网格 - 您可以在PageLoad事件中执行此操作 - 例如

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

答案 1 :(得分:0)

在GridView1_SelectedIndexChanged事件中,您可以简单地执行一个RowCount,以便在其他代码运行之前查看该值是否为!= 0?

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