2012-08-07 19 views
5

He creado un control mayor editable gridview usuario web (BulkEditGridView.ascx) desde el enlace de abajo con sólo copiar pegar, que no incluía ningún código externo:Guardar botón no funciona, cuando el panel de actualización se utiliza

http://blogs.msdn.com/b/mattdotson/archive/2005/11/09/real-world-gridview-bulk-editing.aspx

que añade el control BulkEditGridView en otro control de usuario web OrderDetailGridView.ascx y añadir la fuente de datos a BulkEditGridView

Lo que estoy Tring para hacer es tener una lista desplegable interdependientes y 2 cajas de texto dentro de mi BulkEditGridView. (Consulte el código fuente OrderDetailGridView.ascx) En el momento en que la lista desplegable cambia, los cuadros de texto permanecen sin cambios, después de hacer clic en el botón Guardar, los valores correspondientes se actualizan y se muestran en cuadros de texto.

Sin embargo, lo que quiero hacer es cambiar la lista desplegable, antes de hacer clic en el botón guardar, quiero ver los valores correspondientes dentro de los cuadros de texto y luego poder guardar con el botón Guardar.

Me trataron de establecer autpostback = verdadero acontecimiento y ddl_MaterialCode_SelectedIndexChanged para cambiar los cuadros de texto, pero luego el botón no funciona ahorrar,

traté de poner un UpdatePanel, otra vez lo mismo, botón de guardar no funcionó.

A continuación se muestran los códigos fuente de mi código en los que el botón Guardar funciona cuando los cuadros de texto se actualizan después de hacer clic en Guardar.

código fuente BulkEditGridView.ascx (que no añade nada a mí mismo, sólo tienes que copiar y pegar):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace Exportal.Controls 
{ 
    public partial class BulkEditGridView : System.Web.UI.WebControls.GridView 
    { 


     private List<int> dirtyRows = new List<int>(); 

     [IDReferenceProperty(typeof(Control))] 
     public string SaveButtonID 
     { 
      get 
      { 
       string val = (string)this.ViewState["SaveButtonID"]; 
       if (val == null) 
       { 
        return string.Empty; 
       } 
       return val; 
      } 
      set 
      { 
       this.ViewState["SaveButtonID"] = value; 
      } 
     } 

     protected override GridViewRow CreateRow(int rowIndex, int dataSourceIndex, DataControlRowType rowType, DataControlRowState rowState) 
     { 
      return base.CreateRow(rowIndex, dataSourceIndex, rowType, rowState | DataControlRowState.Edit); 
     } 

     protected override void OnLoad(EventArgs e) 
     { 

      base.OnLoad(e); 

      //Attach an event handler to the save button. 
      if (false == string.IsNullOrEmpty(this.SaveButtonID)) 
      { 
       Control btn = RecursiveFindControl(this.NamingContainer, this.SaveButtonID); 
       if (null != btn) 
       { 
        if (btn is Button) 
        { 
         ((Button)btn).Click += new EventHandler(SaveClicked); 
        } 
       } 
      } 

     } 
     private void SaveClicked(object sender, EventArgs e) 
     { 
      this.Save(); 
      this.DataBind(); 
     } 

     protected override void InitializeRow(GridViewRow row, DataControlField[] fields) 
     { 
      base.InitializeRow(row, fields); 
      foreach (DataControlFieldCell cell in row.Cells) 
      { 
       if (cell.Controls.Count > 0) 
       { 
        AddChangedHandlers(cell.Controls); 
       } 
      } 
     } 

     private void AddChangedHandlers(ControlCollection controls) 
     { 
      foreach (Control ctrl in controls) 
      { 
       if (ctrl is TextBox) 
       { 
        ((TextBox)ctrl).TextChanged += new EventHandler(this.HandleRowChanged); 
       } 
       else if (ctrl is CheckBox) 
       { 
        ((CheckBox)ctrl).CheckedChanged += new EventHandler(this.HandleRowChanged); 
       } 
       else if (ctrl is DropDownList) 
       { 
        ((DropDownList)ctrl).SelectedIndexChanged += new EventHandler(this.HandleRowChanged); 
       } 
      } 
     } 

     void HandleRowChanged(object sender, EventArgs args) 
     { 
      GridViewRow row = ((Control)sender).NamingContainer as GridViewRow; 
      if (null != row && !dirtyRows.Contains(row.RowIndex)) 
      { 
       dirtyRows.Add(row.RowIndex); 
      } 
     } 
     public void Save() 
     { 
      foreach (int row in dirtyRows) 
      { 
       this.UpdateRow(row, false); 
      } 

      dirtyRows.Clear(); 
     } 
     private Control RecursiveFindControl(Control namingcontainer, string controlName) 
     { 
      Control c = namingcontainer.FindControl(controlName); 

      if (c != null) 
       return c; 

      if (namingcontainer.NamingContainer != null) 
       return RecursiveFindControl(namingcontainer.NamingContainer, controlName); 

      return null; 
     } 
    } 
} 

OrderDetailGridView.ascx código fuente:

<cc1:BulkEditGridView ID="BulkEditGridView1" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="RowNo" DataSourceID="SqlDataSource1" SaveButtonID="btn_Kaydet"> 
    <Columns> 
     <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" /> 
     <asp:BoundField DataField="PONumber" HeaderText="PONumber" SortExpression="PONumber" /> 
     <asp:TemplateField HeaderText="MaterialCode" SortExpression="MaterialCode"> 
      <EditItemTemplate> 
       <asp:DropDownList ID="ddl_MaterialCode" runat="server" DataSourceID="SqlDataSource2" 
        DataTextField="MaterialCode" DataValueField="MaterialCode" SelectedValue='<%# Bind("MaterialCode") %>' 
        OnSelectedIndexChanged="ddl_MaterialCode_SelectedIndexChanged" > 
       </asp:DropDownList> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="MaterialDescription" SortExpression="MaterialDescription"> 
      <EditItemTemplate> 
       <asp:TextBox ID="txt_MaterialDescription" runat="server" Text='<%# Bind("MaterialDescription") %>' 
        Enabled="false"></asp:TextBox> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="MaterialCategory" SortExpression="MaterialCategory"> 
      <EditItemTemplate> 
       <asp:TextBox ID="txt_MaterialCategory" runat="server" Text='<%# Bind("MaterialCategory") %>' 
        Enabled="false"></asp:TextBox> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:BoundField DataField="UnitOfMeasure" HeaderText="UnitOfMeasure" SortExpression="UnitOfMeasure" /> 
     <asp:BoundField DataField="Quantity" HeaderText="Quantity" SortExpression="Quantity" /> 
     <asp:BoundField DataField="ContainerType" HeaderText="ContainerType" SortExpression="ContainerType" /> 
     <asp:BoundField DataField="LoadingDate" HeaderText="LoadingDate" SortExpression="LoadingDate" /> 
    </Columns> 
</cc1:BulkEditGridView> 
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MyDbConn %>" 
    DeleteCommand="DELETE FROM [OrderDetail] WHERE [RowNo] = @RowNo" InsertCommand="INSERT INTO [OrderDetail] ([FileNo], [PONumber], [MaterialCode], [MaterialDescription], [MaterialCategory], [UnitOfMeasure], [Quantity], [ContainerType], [LoadingDate]) VALUES (@FileNo, @PONumber, @MaterialCode, @MaterialDescription, @MaterialCategory, @UnitOfMeasure, @Quantity, @ContainerType, @LoadingDate)" 
    SelectCommand="SELECT * FROM [OrderDetail]" UpdateCommand="UPDATE [OrderDetail] SET [FileNo] = @FileNo, [PONumber] = @PONumber, [MaterialCode] = @MaterialCode, [MaterialDescription] = @MaterialDescription, [MaterialCategory] = @MaterialCategory, [UnitOfMeasure] = @UnitOfMeasure, [Quantity] = @Quantity, [ContainerType] = @ContainerType, [LoadingDate] = @LoadingDate WHERE [RowNo] = @RowNo"> 
    <DeleteParameters> 
     <asp:Parameter Name="RowNo" Type="Int32" /> 
    </DeleteParameters> 
    <InsertParameters> 
     <asp:Parameter Name="FileNo" Type="Int32" /> 
     <asp:Parameter Name="PONumber" Type="String" /> 
     <asp:Parameter Name="MaterialCode" Type="String" /> 
     <asp:Parameter Name="MaterialDescription" Type="String" /> 
     <asp:Parameter Name="MaterialCategory" Type="String" /> 
     <asp:Parameter Name="UnitOfMeasure" Type="String" /> 
     <asp:Parameter Name="Quantity" Type="Int32" /> 
     <asp:Parameter Name="ContainerType" Type="String" /> 
     <asp:Parameter Name="LoadingDate" Type="String" /> 
    </InsertParameters> 
    <UpdateParameters> 
     <asp:Parameter Name="FileNo" Type="Int32" /> 
     <asp:Parameter Name="PONumber" Type="String" /> 
     <asp:Parameter Name="MaterialCode" Type="String" /> 
     <asp:Parameter Name="MaterialDescription" Type="String" /> 
     <asp:Parameter Name="MaterialCategory" Type="String" /> 
     <asp:Parameter Name="UnitOfMeasure" Type="String" /> 
     <asp:Parameter Name="Quantity" Type="Int32" /> 
     <asp:Parameter Name="ContainerType" Type="String" /> 
     <asp:Parameter Name="LoadingDate" Type="String" /> 
     <asp:Parameter Name="RowNo" Type="Int32" /> 
    </UpdateParameters> 
</asp:SqlDataSource> 
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:MyDbConn %>" 
    SelectCommand="SELECT [MaterialCode] FROM [Materials]"></asp:SqlDataSource> 
<asp:Button ID="btn_Kaydet" runat="server" Text="Save" /> 

código fuente OrderDetailGridView.ascx.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using SOrderDetailData; 
using System.Data; 

namespace Exportal.Controls 
{ 
    public partial class OrderDetailGridView : System.Web.UI.UserControl 
    { 
     protected void ddl_MaterialCode_SelectedIndexChanged(object sender, EventArgs e) 
     { 

      DataTable dt = new DataTable(); 
      dt = OrderDetailData.GetMaterials(); 

      DropDownList ddl_MaterialCode = (DropDownList)sender; 
      GridViewRow r = (GridViewRow)ddl_MaterialCode.Parent.Parent; 

      TextBox txt_MaterialDescription = (TextBox)r.FindControl("txt_MaterialDescription"); 
      TextBox txt_MaterialCategory = (TextBox)r.FindControl("txt_MaterialCategory");    

      txt_MaterialDescription.Text = dt.Rows[ddl_MaterialCode.SelectedIndex]["MaterialDescription"].ToString(); 
      txt_MaterialCategory.Text = dt.Rows[ddl_MaterialCode.SelectedIndex]["MaterialCategory"].ToString(); 


     } 
    } 
} 
+0

¿Con qué navegador estás probando? – bUKaneer

+0

internet explorer 9 – HOY

+0

¿Funciona correctamente en * cualquier * navegador (por ejemplo, IE8), o funciona mal en todos los navegadores? –

Respuesta

1

Dos cosas que debes probar: Pon un punto de ruptura en el siguiente código y depuración. Comprobar que la aplicación está alcanzando este BTN ...

if (null != btn) { 
    if (btn is Button) { 
     ((Button)btn).Click += new EventHandler(SaveClicked); 
    } 
} 

Después de verificar que, se debe añadir este botón para el gestor de la escritura

if (null != btn) { 
    if (btn is Button) { 
     ((Button)btn).Click += new EventHandler(SaveClicked); 
     ScriptManager.GetCurrent(Page).RegisterAsyncPostBackControl(btn); 
    } 
} 

hace esto es el control dentro de un UpdatePanel alguna manera (tal vez su mastepage tiene un panel de actualización para todo el contenido)?

1

Si todo lo que quiero hacer es rellenar los cuadros de texto con los valores seleccionados de los menús desplegables, sugeriría jQuery ...

$('.dropdownclass').change(function() { 
    $(this).closest('tr').find('.textboxclass').val($(this).val()); 
}); 

Entonces usted no tiene que hacer las devoluciones de datos additonal y es de esperar que su botón el clic funcionará.

1

Si todo lo que quiere hacer es rellenar los cuadros de texto con los valores seleccionados de los menús desplegables, también sugeriría jQuery como alguien escribió antes ...

Pero si usted tiene que hacer algo más cuando los cambios desplegables ... Debe usar el evento RowCommand de su grilla. Esto podría ayudar RowCommand

historia corta:

  1. complemento OnRowCommand = "myGrid_RowCommand" a las propiedades de la cuadrícula
  2. añadir CommandName = "ddlChanged" a las propiedades de la lista desplegable en la red
  3. si tiene más de 1 comando en cada fila de la cuadrícula, la función myGrid_RowCommand debe tener este aspecto

    void myGrid_RowCommand(Object sender, GridViewCommandEventArgs e) {  
    if(e.CommandName=="ddlChanged") 
        {// Do something 
        } 
    if(e.CommandName == "ddl2Changed") 
        {// Do something else 
        } 
    ... 
    } 
    
Cuestiones relacionadas