2010-03-12 10 views
8

में ग्रिड व्यू के न्यूवैल्यूज और ओल्डवैलस खाली हैं मेरे पास नीचे ग्रिड व्यू है। मैं पीछे कोड में एक कस्टम डेटास्रोत के लिए बाध्यकारी हूँ। यह "OnRowUpdating" ईवेंट में ठीक हो जाता है, लेकिन कोई नया वैल्यू या ओल्डवैल नहीं है। कोई सुझाव है कि मैं इन मूल्यों को कैसे प्राप्त कर सकता हूं?ऑनडॉवडेटिंग ईवेंट

<asp:GridView ID="gv_Personnel" 
         runat="server" 
         OnRowDataBound="gv_Personnel_DataBind" 
         OnRowCancelingEdit="gv_Personnel_CancelEdit" 
         OnRowEditing="gv_Personnel_EditRow" 
         OnRowUpdating="gv_Personnel_UpdateRow" 
         AutoGenerateColumns="false" 
         ShowFooter="true" 
         DataKeyNames="BudgetLineID" 
         AutoGenerateEditButton="true" 
         AutoGenerateDeleteButton="true" 
         > 
      <Columns>     
       <asp:BoundField HeaderText="Level of Staff" DataField="LineDescription" /> 
       <%--<asp:BoundField HeaderText="Hrs/Units requested" DataField="NumberOfUnits" />--%> 
       <asp:TemplateField HeaderText="Hrs/Units requested"> 
        <ItemTemplate> 
         <%# Eval("NumberOfUnits")%> 
        </ItemTemplate> 
        <EditItemTemplate> 
         <asp:TextBox ID="tb_NumUnits" runat="server" Text='<%# Bind("NumberOfUnits")%>' /> 
        </EditItemTemplate> 
       </asp:TemplateField> 
       <asp:BoundField HeaderText="Hrs/Units of Applicant Cost Share" DataField="" NullDisplayText="0" /> 
       <asp:BoundField HeaderText="Hrs/Units of Partner Cost Share" DataField="" NullDisplayText="0" /> 
       <asp:BoundField FooterStyle-Font-Bold="true" FooterText="TOTAL PERSONNEL SERVICES:" HeaderText="Rate" DataFormatString="{0:C}" DataField="UnitPrice" /> 
       <asp:TemplateField HeaderText="Amount Requested" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/> 
       <asp:TemplateField HeaderText="Applicant Cost Share" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/> 
       <asp:TemplateField HeaderText="Partner Cost Share" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/> 
       <asp:TemplateField HeaderText="Total Projet Cost" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/> 
      </Columns> 
     </asp:GridView> 

उत्तर

4

GridView नियंत्रण के RowUpdating घटना समस्या पर के बारे में, यह अपेक्षित व्यवहार है, क्योंकि जब हम कर डेटास्रोत नियंत्रण के साथ GridView (या अन्य ASP.NET 2.0 डेटाबाउंड नियंत्रण) संबद्ध नहीं है, यह जीता पैरामीटर संग्रह अद्यतन/हटाने/... घटनाओं के स्वचालित रूप से पूछताछ और भरें। ऐसे मामलों में, हमें टेम्पलेट नियंत्रण से फ़ील्ड मान मैन्युअल रूप से निकालने की आवश्यकता है।

यह माइक्रोसॉफ्ट कर्मचारी here में कहता है।

उस स्थिति में आप इसे NewValues ​​संग्रह स्वयं बनाने के लिए ExtractValuesFromCell विधि का उपयोग करके कर सकते हैं।

संपादित करें:

मैं this ब्लॉग की टिप्पणियों में कोड का एक टुकड़ा मिला:

protected void OnRowEditing(object sender, GridViewEditEventArgs e) 
{  
     GridView gv = (GridView)sender; 
     gv.EditIndex = e.NewEditIndex; 
     gv.DataBind(); 
     ... 
} 

protected void OnRowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    GridView gv = (GridView)sender; 
    for (int i = 0; i < gv.Columns.Count; i++) 
    { 
     DataControlFieldCell cell = gv.Rows[e.RowIndex].Cells[i] as DataControlFieldCell; 
     gv.Columns[i].ExtractValuesFromCell(e.NewValues, cell, DataControlRowState.Edit, true); 
    } 
    // now you can use NewValues collection normally 
} 

Havent यह परीक्षण किया है, लेकिन समस्या का समाधान करने के लिए, अगर यह किया मुझे पता है लगता है।

+0

e.Keys बजाय gv.Columns [i] .xtractValuesFromCell (e.NewValues, cell, – ONYX

5

इम यकीन नहीं करता है, तो यह इस help..but हैं मैं MSDN site

कुंजी, OldValues ​​और NewValues ​​संग्रह स्वचालित रूप से केवल भर जाती है में क्या मिला जब GridView नियंत्रण डेटा के लिए बाध्य है है DataSourceID प्रॉपर्टी का उपयोग करके।

+0

तो क्या आप कह रहे हैं कि उन मानों का उपयोग केवल तभी किया जा सकता है जब आप एएसपीएक्स पेज पर डेटास्रोत को परिभाषित और उपयोग कर रहे हों? –

+0

मुझे यकीन नहीं है कि मैंने कोशिश नहीं की है लेकिन बयान में कहा गया है कि आपको GridView के साथ बाध्यकारी में DataSourceID प्रॉपर्टी का उपयोग करने की आवश्यकता है। मैं कोशिश कर सकता हूं और देख सकता हूं कि क्या आप डेटासोर्स को आईडी असाइन कर सकते हैं और इसे कोड में बाध्य कर सकते हैं।यदि नहीं, तो मैं नीचे दिए गए सुझाव का प्रयास करूंगा =) – hallie

1

मैं अपने पेज_लोड ईवेंट में डाटाबेसिंग कर रहा था और जब मैंने पोस्टबैक "अद्यतन" पर क्लिक किया था, तो पेज_लोड ईवेंट निकाल दिया गया था। ग्रिड व्यू पुराने मानों से फिर से भर गया था, इसलिए myGrid.RowUpdating ईवेंट में मैं नए मान पुनर्प्राप्त नहीं कर सका। यदि यह

0

सहायता करता है तो आपको फॉर्म लोड में IsPostback की जांच करने की आवश्यकता है। जब ग्रिडव्यू के अपडेट ने पोस्टबैक किया, तो यह पहले पुराने मूल्यों के साथ ताज़ा हो गया।

Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender 
    GridBinder() 
End Sub 

एनबी::

If Not IsPostback Then 

    ' Data bind here 

End If 

इस तरह, यह 'नई' gridview मूल्यों

+1

यह समझा नहीं जाता है कि क्यों * पुराने मान * शून्य हैं और इसलिए समाधान नहीं है इस मुद्दे पर। यह एक आम गलती है, हालांकि, ग्रिड विली को पुनर्जीवित करने के लिए। – MetalPhoenix

1

बाइंड इस तरह पृष्ठ को पूर्व ईवेंट हैंडलर में ओवरराइट नहीं करेगी: इसे रोकने के लिए IsPostBack का प्रयोग करें पूर्वप्रस्तुत RowUpdating घटना के बाद होता है।