2009-08-19 5 views
1

Je continue de this post.ASP.NET - Travailler avec GridView par programme

Après beaucoup de recherche sur Google, je suis venu avec ce code pour modifier les cellules par programme:

using System; 
using System.Data; 
using System.Configuration; 
using System.Collections; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 

using Ice_Web_Portal.BO; 

namespace GridView___Test 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      GridView1.DataSource = Course.GetCourses(); 
      GridView1.DataBind(); 
     } 

     protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) 
     { 
      GridViewRow row = GridView1.Rows[e.NewEditIndex]; 

      GridView1.EditIndex = e.NewEditIndex; 

      GridView1.DataSource = Course.GetCourses(); 
      GridView1.DataBind(); 
     } 

     protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
     { 
      TextBox txtID = (TextBox)GridView1.Rows[e.RowIndex].Cells[1].Controls[0]; 
      TextBox txtCourseCode = (TextBox)GridView1.Rows[e.RowIndex].Cells[2].Controls[0]; 
      TextBox txtCourseName = (TextBox)GridView1.Rows[e.RowIndex].Cells[3].Controls[0]; 
      TextBox txtCourseTextBookCode = (TextBox)GridView1.Rows[e.RowIndex].Cells[4].Controls[0]; 

      Course item = new Course(); 
      item.ID = Convert.ToInt32(txtID.Text); 
      item.CourseCode = txtCourseCode.Text; 
      item.CourseName = txtCourseName.Text; 
      item.TextBookCode = txtCourseTextBookCode.Text; 

      bool success = Course.Update(item); 

      labMessage.Text = success.ToString(); 

      GridView1.EditIndex = -1; 
      GridView1.DataSource = Course.GetCourses(); 
      GridView1.DataBind(); 
     } 
    } 
} 

Mais 2 problèmes se produisent.

(1) Je dois appuyer deux fois sur les boutons de commande pour éditer/mettre à jour.

(2) Les modifications des valeurs de cellule ne sont pas mises à jour dans la base de données. C'est à dire. les valeurs de cellule modifiées ne sont pas validées.

Quelqu'un peut-il me donner une solution?

MISE À JOUR: Ma solution était comme ça:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="GridView___Test._Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title>Untitled Page</title> 
</head> 

<body> 
    <form id="form1" runat="server"> 
    <div> 

     <asp:GridView ID="GridView1" runat="server" Font-Names="Verdana" Font-Size="Small" AutoGenerateColumns="False" OnRowCancelingEdit="GridView1_RowCancelingEdit" OnRowCommand="GridView1_RowCommand" OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating">    
     </asp:GridView> 

    </div> 
    </form> 
</body> 

</html> 

namespace GridView___Test 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      //if (!Page.IsPostBack) 
      { 
       CreateGridView(); 
      } 
     } 

     private void CreateGridView() 
     { 
      GridView1.Columns.Clear(); 

      DataTable dataTable = Book.GetBooksDataSet().Tables[0]; 

      CommandField cf = new CommandField(); 
      cf.ShowEditButton = true; 

      GridView1.Columns.Add(cf); 

      int colCount = 1; 
      foreach (DataColumn c in dataTable.Columns) 
      { 
       BoundField boundField = new BoundField(); 

       boundField.DataField = c.ColumnName; 
       boundField.HeaderText = c.ColumnName; 
       //boundField.FooterText = "---"; 

       if (colCount == 3 || colCount == 5) 
       { 
        boundField.ReadOnly = true; 
       } 

       GridView1.Columns.Add(boundField); 
       colCount++; 
      } 

      GridView1.ShowFooter = true; 

      GridView1.DataSource = dataTable; 
      GridView1.DataBind(); 

      GridViewRow footerRow = GridView1.FooterRow; 
      Button b = new Button(); 
      b.Text = "Add New"; 
      int i = 0; 
      footerRow.Cells[i].Controls.Add(b); 
      foreach (DataColumn c in dataTable.Columns) 
      { 
       ++i; 
       TextBox tb = new TextBox(); 
       footerRow.Cells[i].Controls.Add(tb); 
      } 
     } 

     protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) 
     { 
      int index = Convert.ToInt32(e.CommandArgument); 

      if (e.CommandName == "Edit") 
      { 
       //Takes the GridView to Edit mode. 
       GridView1.EditIndex = index; 

       GridViewRow selectedRow = ((GridView)e.CommandSource).Rows[index]; 

       //We can get cell data like this 
       string id = selectedRow.Cells[1].Text; 
       string isbn = selectedRow.Cells[2].Text; 

       //This is necessary to GridView to be showed up. 
       CreateGridView(); 
      } 
      else if (e.CommandName == "Update") 
      { 
       LinkButton updateButton = (LinkButton)e.CommandSource; 

       DataControlFieldCell dcfc = (DataControlFieldCell)updateButton.Parent; 

       GridViewRow gvr = (GridViewRow)dcfc.Parent; 

       //The update................... 
       //Update grid-data to database 
       UpdateDataInTheDatabase(gvr.Cells[1].Controls);     

       //Grid goes back to normal 
       GridView1.EditIndex = -1; 

       //This is necessary to GridView to be showed up. 
       CreateGridView(); 
      } 
     } 

     private void UpdateDataInTheDatabase(ControlCollection cc) 
     { 
      TextBox tb = (TextBox)cc[0]; 
      //... 
      //... 
      //... 

      //Call the update persistance code here... 
     } 

     #region Application Satisfactory Event Handlers 
     protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) 
     { 
     } 

     protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) 
     { 
     } 

     protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
     { 
     } 
     #endregion 
    } 
} 

Répondre

3

pour le problème # 1, essayez

protected void Page_Load(object sender, EventArgs e) 
    { 
     if(!Page.IsPostBack) 
     { 
     GridView1.DataSource = Course.GetCourses(); 
     GridView1.DataBind(); 
     } 
    } 

pour le problème # 2, nous devons vérifier votre méthode Course.Update(item).

+0

Ma méthode de mise à jour n'a pas de problème je pense, car quand je lance des cellules dans des TextBox, elles me montrent toujours des anciennes valeurs. C'est à dire. les valeurs de cellule modifiées ne sont pas validées. – anonymous

+0

J'ai défini des points de rupture et je l'ai examiné. – anonymous

+0

Si la méthode Update ne fonctionne pas, cela peut être un problème dans vos procédures sql ou la transaction reste ouverte et aucune instruction sql ne s'exécute. Assurez-vous de cela s'il vous plaît. – Myra

0
//To Add Esit,Update,Cancel in gridview control ..... 
//source 
<asp:CommandField ShowEditButton="True" HeaderText="Edit Product Name &amp; Price" /> 

//c# code 
    public void gris() 
     { 
      con.Open(); 
      SqlDataAdapter da = new SqlDataAdapter(); 
      da.SelectCommand = new SqlCommand("select * from Product_details", con); 
      DataSet ds = new DataSet(); 
      da.Fill(ds); 
      Gridview1.DataSource = ds; 
      Gridview1.DataBind(); 
      con.Close(); 
     } 
protected void Gridview1_RowEditing(object sender, GridViewEditEventArgs e) 
     { 
      Gridview1.EditIndex = e.NewEditIndex; 
      gris(); 
     } 

     protected void Gridview1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) 
     { 
      Gridview1.EditIndex = -1; 
      gris(); 
     } 

     protected void Gridview1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
     { 
      string id = addproduct2.DataKeys[e.RowIndex].Value.ToString(); 
      string name = ((TextBox)addproduct2.Rows[e.RowIndex].Cells[1].Controls[0]).Text;//(or)Controls[1] 
      string rate = ((TextBox)addproduct2.Rows[e.RowIndex].Cells[4].Controls[0]).Text;//(or)Controls[1] 
      con.Open(); 
      cmd = new SqlCommand("update Product_details set product_name='" + name + "',Product_rate='" + rate + "',product_unitprice='" + rate + "' where product_id='" + id + "'", con); 
      int i = cmd.ExecuteNonQuery(); 
      if (i >= 1) 
      { 
       Response.Write("Updated"); 
      } 
      con.Close(); 
      Gridview1.EditIndex = -1; 
      gris(); 

     }