2012-09-27 3 views
-3

J'essaie d'implémenter un événement button_click en C# de sorte que si le bouton est enfoncé, le gridview est rempli avec les résultats de la requête mais je reçois l'erreur ci-dessus.System.IndexOutOfRangeException: Impossible de trouver la table 0

Voici le code:

public partial class Pages_Managingpayment : System.Web.UI.Page 
{ 
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MyServer"].ConnectionString); 
    protected void Page_Load(object sender, EventArgs e) 
    { 

     if(IsPostBack) 
     { 
      Load(); 
    } 
    } 
    protected void Load() { 
     DataSet ds = new DataSet(); 
     ds.Tables[0].Rows.Add(ds.Tables[0].NewRow()); 
     GridView1.DataSource = ds; 
     GridView1.DataBind(); 
     int columncount = GridView1.Rows[0].Cells.Count; 
     GridView1.Rows[0].Cells.Clear(); 
     GridView1.Rows[0].Cells.Add(new TableCell()); 
     GridView1.Rows[0].Cells[0].ColumnSpan = columncount; 
     GridView1.Rows[0].Cells[0].Text = "No records on display"; 
    } 
    protected void SearchButton_Click(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
     { 
      BindEmployeeDetails(); 
     } 
    } 
    protected void BindEmployeeDetails() 
    { 
     con.Open(); 
     SqlCommand cmd = new SqlCommand("Select * from users", con); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     DataSet ds = new DataSet(); 
     da.Fill(ds); 
     con.Close(); 
     if (ds.Tables[0].Rows.Count > 0) 
     { 
      GridView1.DataSource = ds; 
      GridView1.DataBind(); 
     } 
     else 
     { 
      ds.Tables[0].Rows.Add(ds.Tables[0].NewRow()); 
      GridView1.DataSource = ds; 
      GridView1.DataBind(); 
      int columncount = GridView1.Rows[0].Cells.Count; 
      GridView1.Rows[0].Cells.Clear(); 
      GridView1.Rows[0].Cells.Add(new TableCell()); 
      GridView1.Rows[0].Cells[0].ColumnSpan = columncount; 
      GridView1.Rows[0].Cells[0].Text = "No Records Found"; 
     } 
    } 
    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) 
    { 
     GridView1.EditIndex = e.NewEditIndex; 
     BindEmployeeDetails(); 
    } 
    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
    { 
     //int userid = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value.ToString()); 
     string passwords = GridView1.DataKeys[e.RowIndex].Value.ToString(); 
     TextBox pass = (TextBox)GridView1.Rows[e.RowIndex].FindControl("Password"); 
     TextBox usernames = (TextBox)GridView1.Rows[e.RowIndex].FindControl("username"); 
     TextBox usertypes = (TextBox)GridView1.Rows[e.RowIndex].FindControl("usertype"); 
     con.Open(); 
     SqlCommand cmd = new SqlCommand("update users set User_Type='" + usertypes.Text + "',Username='" + usernames.Text + "' where password='" + passwords + "'", con); 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
     //.ForeColor = Color.Green; 
     //lblresult.Text = username + " Details Updated successfully"; 
     GridView1.EditIndex = -1; 
     BindEmployeeDetails(); 
    } 
    protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) 
    { 
     GridView1.EditIndex = -1; 
     BindEmployeeDetails(); 
    } 
    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) 
    { 
     //int userid = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values["UserId"].ToString()); 
     string passwords = GridView1.DataKeys[e.RowIndex].Values["password"].ToString(); 
     con.Open(); 
     SqlCommand cmd = new SqlCommand("delete from users where password='" + passwords + "'", con); 
     int result = cmd.ExecuteNonQuery(); 
     con.Close(); 
     if (result == 1) 
     { 
      BindEmployeeDetails(); 
      // lblresult.ForeColor = Color.Red; 
      //lblresult.Text = username + " details deleted successfully"; 
     } 
    } 
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
     if (e.CommandName.Equals("AddNew")) 
     { 
      TextBox usertypes = (TextBox)GridView1.FooterRow.FindControl("usertype"); 
      TextBox usernames = (TextBox)GridView1.FooterRow.FindControl("username"); 
      TextBox passwords = (TextBox)GridView1.FooterRow.FindControl("password"); 
      con.Open(); 
      SqlCommand cmd = 
      new SqlCommand(
      "insert into users values('" + usertypes.Text + "','" + 
      usernames.Text + "','" + passwords.Text + "')", con); 
      int result = cmd.ExecuteNonQuery(); 
      con.Close(); 
      if (result == 1) 
      { 
       BindEmployeeDetails(); 
       // lblresult.ForeColor = Color.Green; 
       //lblresult.Text = txtUsrname.Text + " Details inserted successfully"; 
      } 
      else 
      { 
       //lblresult.ForeColor = Color.Red; 
       //lblresult.Text = txtUsrname.Text + " Details not inserted"; 
      } 
     } 
    } 
+2

montrent ur codages .... – DevT

+1

Une conjecture sauvage que vous pourriez avoir quelque chose comme 'DataSet.Tables [0] 'assigné comme' DataSource' mais il semble n'y avoir aucun résultat disponible, donc vous feriez mieux de vérifier la requête et n'oubliez pas de poster le code de saignement. – V4Vendetta

+0

Avez-vous vérifié si les données retournées ont un nombre datable> 0? Il est difficile de dire sans voir votre code ... –

Répondre

1

Je suppose ici est une erreur dans le code:

DataSet ds = new DataSet(); 
ds.Tables[0].Rows.Add(ds.Tables[0].NewRow()); 

ds ne contiendra pas les tables et contiennent donc pas Table[0]. Il serait utile cependant si vous pourriez casser votre code à quelques lignes dans lesquelles l'erreur se produit.

+0

l'erreur se produit dans le Page_Load. Comment puis-je le modifier pour prendre une source de données vide? –

+0

Vérifiez la propriété 'Tables' 'Count' avant d'accéder' Tables [0] '. –

0

Assurez-vous de vérifier l'index avant d'utiliser une table ou une ligne. J'ai modifié votre méthode de chargement et j'espère que vous pourrez modifier d'autres endroits pour corriger les erreurs.

protected void Load() { 
      DataSet ds = new DataSet(); 

      if(ds.Tables.Count == 0) 
      { 
      // Syntax might be wrong. I am trying to add new table if it is missing. 
       ds.Table.Add(new Table()); 
      } 

      ds.Tables[0].Rows.Add(ds.Tables[0].NewRow()); 
      GridView1.DataSource = ds; 
      GridView1.DataBind(); 
      int columncount = GridView1.Rows[0].Cells.Count; 
      GridView1.Rows[0].Cells.Clear(); 
      GridView1.Rows[0].Cells.Add(new TableCell()); 
      GridView1.Rows[0].Cells[0].ColumnSpan = columncount; 
      GridView1.Rows[0].Cells[0].Text = "No records on display"; 
     } 
+0

Je pense que le problème est mon chargement de la page. Tout fonctionne bien si je supprime les données sur le chargement de la page .. comment puis-je le modifier de telle sorte qu'il apporte une grille vide? –

+0

Avez-vous essayé le code que j'ai collé. Semble sur vous Page_Load vous n'appelez que la méthode de chargement. – Shailesh

+0

il est évident qu'il pourrait y avoir pas de tables, lorsque nous créons d'abord un nouveau 'DataSet' – manas

0

Dans la méthode Load() vous créez un nouveau DataSet et essayez d'accéder à son tableau non existant avec le code ds.Tables[0].Rows.Add(ds.Tables[0].NewRow());.

Essayez de créer une nouvelle DataTable et l'ajouter à la DataSet avant qu'elle ne liant le GridView (exemple Here).

Et aussi, lorsque vous appelez la méthode Load(), faire la condition if(!IsPostBack) comme dans:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!IsPostBack) 
    { 
     Load(); 
    } 
} 
Questions connexes