2012-08-07 12 views
5

मैं बस से नीचे दिए गए लिंक से एक थोक संपादन योग्य gridview वेब उपयोगकर्ता नियंत्रण (BulkEditGridView.ascx) बनाया है चिपकाने नकल, मैं किसी भी बाहरी कोड शामिल नहीं है:सहेजें बटन काम नहीं करता है, जब अद्यतन पैनल प्रयोग किया जाता है

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

मैं एक वेब उपयोगकर्ता नियंत्रण OrderDetailGridView.ascx में BulkEditGridView नियंत्रण जोड़ा गया है और BulkEditGridView

मुझे क्या करना tring हूँ एक अन्योन्याश्रित dropdownlist और मेरे BulkEditGridView अंदर 2 बक्सें है करने के लिए डेटा स्रोत जोड़ें। (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

+0

इंटरनेट एक्सप्लोरर 9 – HOY

+0

क्या यह * किसी * ब्राउज़र (उदा। आईई 8) में सही तरीके से काम करता है, या यह सभी ब्राउज़रों में खराब है? –

उत्तर

1

आपको शायद List<int> dirtyRows पर बने रहने की आवश्यकता होगी ताकि यह हो सके पोस्ट वापस urvive। मैं या तो Cache या Session की अनुशंसा करता हूं, हालांकि उपलब्ध सभी विकल्पों के लिए यह एमएसडीएन आलेख Nine Options for Managing Persistent User State in Your ASP.NET Application देखें।

+0

मैं कैश के लिए वोट देता हूं! – CoderMarkus

1

दो चीजें आपको आजमाएं: नीचे दिए गए कोड पर एक ब्रेक-पॉइंट डालें और डीबग करें। (हो सकता है आपके mastepage जाँच करें कि एप्लिकेशन को इस 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 के अंदर है क्या सभी सामग्री के लिए एक अद्यतन पैनेल है)?

1

यदि आप केवल इतना ड्रॉपडाउन से चयनित मानों के साथ बक्सें पॉप्युलेट है क्या करना चाहते हैं, मैं jQuery सुझाव है ...

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

तो फिर आप अपने बटन अतिरिक्त Postbacks करते हैं और उम्मीद है कि की जरूरत नहीं है क्लिक काम करेगा।

1

यदि सब आप क्या करना चाहते ड्रॉपडाउन से चयनित मानों के साथ बक्सें पॉप्युलेट है, मैं भी jQuery सुझाव है कि जैसे किसी से पहले लिखा था ...

लेकिन आप कुछ और करने की आवश्यकता है, तो जब लटकती परिवर्तन ... आपको अपने ग्रिड की रोकॉमैंड घटना का उपयोग करने की आवश्यकता है। यह मदद कर सकता है RowCommand

लघु कहानी:

  1. ऐड OnRowCommand = "myGrid_RowCommand" ग्रिड के गुणों के
  2. ग्रिड में लटकती के गुणों के commandname = "ddlChanged" जोड़ने
  3. यदि आपके पास ग्रिड की प्रत्येक पंक्ति में 1 से अधिक कमांड हैं तो myGrid_RowCommand फ़ंक्शन इस

    void myGrid_RowCommand(Object sender, GridViewCommandEventArgs e) {  
    if(e.CommandName=="ddlChanged") 
        {// Do something 
        } 
    if(e.CommandName == "ddl2Changed") 
        {// Do something else 
        } 
    ... 
    } 
    
  4. जैसा दिखना चाहिए
संबंधित मुद्दे