2012-08-07 19 views
5

ho creato una massa di controllo utente web gridview modificabile (BulkEditGridView.ascx) dal link sottostante da basta copiare e incollare, non ho incluso alcun codice esterno:Salva pulsante non funziona, quando pannello di aggiornamento viene utilizzato

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

ho aggiunto controllo BulkEditGridView in un altro controllo utente web OrderDetailGridView.ascx e aggiungere origine dati per BulkEditGridView

Quello che sto Tring di fare è di avere un dropdownlist interdipendente e 2 caselle di testo dentro la mia BulkEditGridView. (vedi il codice sorgente OrderDetailGridView.ascx) Nel momento in cui la lista a discesa cambia, le caselle di testo rimangono invariate, dopo aver fatto clic sul pulsante Salva, i valori corrispondenti vengono aggiornati e visibili nelle caselle di testo.

Tuttavia, quello che voglio fare è quando cambia elenco a discesa, prima di fare clic sul pulsante di salvataggio, voglio vedere i valori corrispondenti all'interno delle caselle di testo, e quindi essere in grado di salvare con il pulsante di salvataggio.

ho cercato di impostare autpostback = true e ddl_MaterialCode_SelectedIndexChanged evento per modificare le caselle di testo, ma poi il pulsante non funziona salvare,

ho cercato di mettere un UpdatePanel, di nuovo lo stesso, pulsante di salvataggio non ha funzionato.

Di seguito sono riportati i codici sorgente del mio codice in cui il pulsante di salvataggio funziona dove sono state selezionate le caselle di testo aggiornate dopo il salvataggio.

BulkEditGridView.ascx codice sorgente (non ho aggiunto nulla di me, solo copia incolla):

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 codice sorgente:

<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" /> 

il codice sorgente di 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

Quale browser stai testando? – bUKaneer

+0

internet explorer 9 – HOY

+0

Funziona correttamente in * qualsiasi * browser (ad es. IE8), o funziona male in tutti i browser? –

risposta

1

Due cose da provare: Inserisci un punto di interruzione nel codice riportato di seguito e esegui il debug. Controllare che l'applicazione sta raggiungendo questo BTN ...

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

Dopo aver verificato che, si dovrebbe aggiungere questo pulsante per lo script manager

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

Questo controllo è all'interno di un UpdatePanel in qualche modo (forse la vostra mastepage ha un updatepanel per tutto il contenuto)?

1

Se tutto quello che vogliamo fare è compilare le caselle di testo con i valori selezionati dal menu di scorrimento, vorrei suggerire jQuery ...

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

allora non hanno a che fare postback additonal e, auspicabilmente, il pulsante il clic funzionerà.

1

Se tutto quello che vogliamo fare è compilare le caselle di testo con i valori selezionati dal menu di scorrimento, vorrei anche suggerire jQuery come qualcuno ha scritto prima ...

Ma se avete bisogno di fare qualcosa di più quando cambia la discesa ... È necessario utilizzare l'evento RowCommand della griglia. Questo potrebbe aiutare RowCommand

Breve storia:

  1. add OnRowCommand = "myGrid_RowCommand" per le proprietà della griglia
  2. aggiungere CommandName = "ddlChanged" per le proprietà del menu a discesa nella griglia
  3. se si dispone di più di 1 comando in ogni riga della griglia la funzione myGrid_RowCommand dovrebbe apparire come questa

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