2012-08-07 61 views
5

我創建從下面的鏈接批量編輯gridview的web用戶控件(BulkEditGridView.ascx)通過直接複製粘貼,我不包括任何外部代碼:保存按鈕不起作用,當更新面板用於

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

我加BulkEditGridView控制到另一個網絡的用戶控制OrderDetailGridView.ascx並添加數據源到BulkEditGridView

什麼我特林做的是有一個相互依存的下拉列表和文本框2我BulkEditGridView內。 (請參閱OrderDetailGridView.ascx源代碼)在下拉列表更改時,文本框保持不變,單擊保存按鈕後,相應的值將在文本框中更新並顯示。

但是我想要做的是,當下拉列表改變,點擊保存按鈕之前,我想看到相應的文本框裏面的值,然後能夠保存保存按鈕。

我試圖設置autpostback =真實ddl_MaterialCode_SelectedIndexChanged事件改變文本框,但隨後保存按鈕不起作用,

我試圖把一個UpdatePanel,再次相同,保存按鈕不起作用。

下面是我的代碼的源代碼,該保存按鈕的作品,其中保存之後更新文本框被點擊。

BulkEditGridView.ascx源代碼(我沒加任何東西我自己,只是複製粘貼):

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源代碼:

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

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

您正在測試哪個瀏覽器? – bUKaneer 2012-08-09 11:12:41

+0

Internet Explorer 9 – HOY 2012-08-09 11:13:11

+0

它在任何*瀏覽器(例如IE8)中都能正常運行嗎?還是在所有瀏覽器中都有問題? – 2012-08-14 17:16:41

回答

1

兩件事情你應該嘗試: 將一個破發點下面的代碼和調試。檢查應用程序是達到這一BTN ...

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

驗證後,應將此按鈕添加到腳本管理

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

這是否控制是一個UpdatePanel內莫名其妙地(也許你mastepage有一個所有內容的更新面板)?

1

如果你想要做的就是填充從下拉菜單中選擇的值的文本框,我建議jQuery的...

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

然後,你不必做產生額外的回傳,希望你的按鈕點擊將工作。

1

如果你想要做的就是填充從下拉菜單中選擇的值的文本框,我也建議jQuery的像一個人以前寫...

但是,如果你需要做更多的事情,當下拉變化...您需要使用網格的RowCommand事件。 這可能有助於RowCommand

短篇小說:

  1. 附加OnRowCommand = 「myGrid_RowCommand」 到電網的特性
  2. 添加的CommandName = 「ddlChanged」 的下拉菜單的屬性在網格
  3. 如果在網格的每一行中有多個命令,myGrid_RowCommand函數應該看起來像這樣

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