2012-08-07 24 views
5

Tôi đã tạo một điều khiển số lượng lớn có thể chỉnh sửa GridView người dùng web (BulkEditGridView.ascx) từ liên kết dưới đây bởi chỉ cần sao chép dán, tôi không bao gồm bất kỳ mã bên ngoài:Lưu nút không hoạt động, khi Update Panel được sử dụng

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

tôi thêm kiểm soát BulkEditGridView vào một điều khiển người dùng web OrderDetailGridView.ascx và thêm nguồn dữ liệu để BulkEditGridView

Những gì tôi Tring làm là để có một DropDownList phụ thuộc lẫn nhau và 2 textbox bên BulkEditGridView tôi. (xem mã nguồn OrderDetailGridView.ascx) Tại thời điểm khi danh sách thả xuống thay đổi, hộp văn bản vẫn không thay đổi, sau khi nhấn nút lưu, các giá trị tương ứng được cập nhật và hiển thị trong hộp văn bản. Tuy nhiên những gì tôi muốn làm là khi danh sách thả xuống thay đổi, trước khi nhấp vào nút lưu, tôi muốn xem các giá trị tương ứng bên trong hộp văn bản và sau đó có thể lưu bằng nút lưu.

Tôi cố gắng để thiết lập autpostback = sự kiện thật và ddl_MaterialCode_SelectedIndexChanged để thay đổi textbox, nhưng sau đó nút không hoạt động tiết kiệm,

Tôi cố gắng để đưa một updatepanel, một lần nữa giống nhau, nút lưu đã không làm việc.

Dưới đây là các mã nguồn của mã của tôi trong đó nút lưu hoạt động khi hộp văn bản được cập nhật sau khi lưu được nhấp.

mã nguồn BulkEditGridView.ascx (Tôi không thêm bất cứ điều gì bản thân mình, chỉ cần sao chép dán):

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 mã nguồn:

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

đang OrderDetailGridView.ascx.cs nguồn

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

Bạn đang thử nghiệm trình duyệt nào? – bUKaneer

+0

internet explorer 9 – HOY

+0

Chức năng có hoạt động chính xác trong trình duyệt * bất kỳ * nào (ví dụ: IE8) hay không hoạt động trong tất cả các trình duyệt? –

Trả lời

1

Hai điều bạn nên thử: Đặt điểm ngắt trên mã bên dưới và gỡ lỗi. Kiểm tra xem các ứng dụng đang vươn btn ...

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

này Sau khi xác minh điều đó, bạn nên thêm nút này để người quản lý kịch bản

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

Liệu kiểm soát này là bên trong một updatepanel bằng cách nào đó (có thể mastepage của bạn có một updatepanel cho tất cả các nội dung)?

1

Nếu tất cả các bạn muốn làm là cư textbox với các giá trị được lựa chọn từ các Dropdowns, tôi sẽ đề nghị jquery ...

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

Sau đó, bạn không cần phải làm postbacks additonal và hy vọng nút của bạn nhấp chuột sẽ hoạt động.

1

Nếu tất cả các bạn muốn làm là cư textbox với các giá trị được lựa chọn từ các Dropdowns, tôi cũng sẽ đề nghị jquery như ai đó đã viết trước ...

Nhưng nếu bạn cần phải làm điều gì đó nhiều hơn khi những thay đổi thả xuống ... Bạn cần sử dụng sự kiện RowCommand của lưới của bạn. này có thể giúp RowCommand

câu chuyện ngắn:

  1. add OnRowCommand = "myGrid_RowCommand" để các thuộc tính của lưới
  2. thêm CommandName = "ddlChanged" để các thuộc tính của thả xuống trong lưới
  3. nếu bạn có nhiều hơn 1 lệnh trong mỗi hàng của lưới, hàm myGrid_RowCommand sẽ giống như thế này

    void myGrid_RowCommand(Object sender, GridViewCommandEventArgs e) {  
    if(e.CommandName=="ddlChanged") 
        {// Do something 
        } 
    if(e.CommandName == "ddl2Changed") 
        {// Do something else 
        } 
    ... 
    } 
    
Các vấn đề liên quan