2011-08-12 10 views
7

में टेक्स्टबॉक्स के मान प्राप्त करने के लिए दोहराने वाले नियंत्रण के माध्यम से लूपिंग मैं अपने दोहराना नियंत्रण के माध्यम से लूप करने की कोशिश कर रहा हूं और टेक्स्टबॉक्स मान प्राप्त कर रहा हूं।एएसपीनेट

{ "वस्तु संदर्भ एक वस्तु का एक उदाहरण के लिए सेट नहीं।"}

मेरी कोड है::
हालांकि, मैं एक त्रुटि हो रही है

Dim txtField As TextBox 
    Dim j As Integer = 0 

    'Confirm if user has entered atleast one quantity 
    For Each item In rptRequestForm.Items 
     txtField = rptRequestForm.FindControl("txtBox") 
     If txtField.Text <> Nothing Then 
      j += 1 
     Else 

     End If 
    Next 

अद्यतन: एएसपीएक्स कोड है:

 <td><asp:Repeater ID="rptRequestForm" runat="server"> 
      <HeaderTemplate> 
        <table border="0" width="100%"> 
         <tr> 
          <td style="width:50%" class="TextFontBold"><asp:Label runat="server" ID="Label1" Text="Product"></asp:Label></td> 
          <td style="width:25%" class="TextFontBold"><asp:Label runat="server" ID="Label2" Text="Quantity"></asp:Label></td> 
          <td style="width:25%" class="TextFontBold"><asp:Label runat="server" ID="Label3" Text="Price (ea.)"></asp:Label></td> 
         </tr> 
        </table> 
      </HeaderTemplate> 
       <ItemTemplate> 
        <table border="0" width="100%"> 
         <tr> 
          <td style="width:50%" class="TextFont"><span><%#Trim(Eval("Product_Title"))%></span></td> 
          <td style="width:25%"><asp:TextBox ID="txtBox" runat="server" Width="30%" onblur="Javascript:numberonly(this)"></asp:TextBox></td> 
          <td style="width:25%" class="TextFont"><span><%#Trim(FormatCurrency(Eval("Price")))%></span></td> 
         </tr> 
        </table> 
       </ItemTemplate> 
      </asp:Repeater> 

उत्तर

12

कोशिश

Dim someString as String = "Not set" <-- used later to hold the values of the string 
Dim txtField As TextBox  
Dim j As Integer = 0 
'Confirm if user has entered atleast one quantity  
For Each item In rptRequestForm.Items   
    txtField = item.FindControl("txtBox")   
    If Not IsNothing(txtField) Then  ' <--- this is the line I changed  
    j += 1 
    someString = txtField.Text ' <-- once you've checked and know that the textbox exists, you just grab the value like so. 
    ' do whatever you like with the contents of someString now.  
    Else   
    End If  
Next 

यह है कि नहीं मिला टेक्स्टबॉक्स स्वयं वह वस्तु है जिस पर कोई संदर्भ नहीं है।

संयोग से, वास्तविक टेक्स्टबॉक्स की एक और संपत्ति (जो मौजूद है और पाया गया) "कुछ भी नहीं" हो सकता है। यह केवल स्ट्रिंग हो सकता है। लक्षण या वैध स्ट्रिंग।

कोड के अपने लाइन संपादित

क्षमा करें, मेरी वीबी जंग लगी है।

अंतिम संपादित

Aargh! मैं अंधा हूँ। मुझे विश्वास नहीं है कि मैंने यह नहीं देखा। मूल कोड के साथ दो समस्याएं थीं।

बदलें

txtField = rptRequestForm.FindControl("txtBox") 

txtField = item.FindControl("txtBox") 

मद है करने के लिए नियंत्रण लगाने के लिए, पुनरावर्तक ही नहीं: इस दूसरे अंक का जवाब है!

मैंने यह देखने के लिए एक छोटा वेब ऐप बनाया है कि मैं टेक्स्टबॉक्स के पाठ को पकड़ रहा था और आखिरकार ऊपर दिया गया मुद्दा मिला। मेरी कोड aspx में तुम्हारा के रूप में ही नहीं है, लेकिन यहाँ एक पूरा कोड तो लिस्टिंग आप देख सकते हैं कि यह कैसे काम करता है:

vb कोड

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

     Dim t As New System.Data.DataTable 

     t.Columns.Add("Name") 

     Dim newRow(1) As Object 

     t.Rows.Add(New Object() {"Frank"}) 
     t.Rows.Add(New Object() {"Dave"}) 
     t.Rows.Add(New Object() {"Muhammad"}) 

     rptRequestForm.DataSource = t 
     rptRequestForm.DataBind() 

     Dim txtField As TextBox 
     Dim j As Integer = 0 'Confirm if user has entered atleast one quantity  
     For Each item As RepeaterItem In rptRequestForm.Items 
      txtField = item.FindControl("txtBox") 
      If Not IsNothing(txtField) Then  ' <--- this is the line I changed    
       j += 1 
       System.Diagnostics.Debug.WriteLine(item.ItemType.ToString()) 
       System.Diagnostics.Debug.WriteLine(txtField.Text) 
      Else 
       System.Diagnostics.Debug.WriteLine(item.ItemType.ToString()) 
      End If 
     Next 
End Sub 

aspx कोड

<asp:Repeater ID="rptRequestForm" runat="server"> 
     <HeaderTemplate> 
      Hello! 
     </HeaderTemplate> 
     <ItemTemplate> 
      <asp:TextBox ID="txtBox" runat="server" Text='<%#Bind("Name") %>'></asp:TextBox> 
      <br /> 
     </ItemTemplate> 
</asp:Repeater> 

का उत्पादन सिस्टम में निम्नलिखित आउटपुट। डायग्नोस्टिक्स।डिबग खिड़की:

आइटम

फ्रैंक

AlternatingItem

डेव

आइटम

मुहम्मद

धागा 0x321c कोड 0 (0x0) के साथ बाहर निकल गया है।

धागा 0x39b8 कोड 0 (0x0) से बाहर निकला है।

+0

डेविड, मुझे एक त्रुटि संदेश मिलता है: ऑपरेटर '<>' को 'System.Web.UI.WebControls.TextBox' और 'System.Web.UI.WebControls.TextBox' प्रकारों के लिए परिभाषित नहीं किया गया है। – Frank

+0

"अगर नहीं तो txtField कुछ भी नहीं है" का उपयोग करें। वीबी संदर्भ प्रकारों और मूल्य प्रकारों के लिए विभिन्न समानता बयानों का उपयोग करता है –

+0

आप सही हैं - मैंने अपना जवाब संपादित किया। कोड की नई पंक्ति आज़माएं। मेरा वीबी जंगली है, और एक शून्य संदर्भ के लिए जांच सी # में अलग है। सी # में यह "! = शून्य" होगा - इन सरल चीजों में से कुछ के लिए मुझे आगे और पीछे स्विच करना कठिन समय है। – David

2

आपको इसे ठीक से डालना होगा Textbox उदा।

TextBox txtField = (TextBox)rptRequestForm.FindControl("txtBox") // C# code 

यहाँ VB.NET कोड है: समस्या यह है कि आप किसी पाठ बॉक्स के ".text" संपत्ति का उपयोग करने की कोशिश कर रहे हैं

Dim txtField As TextBox = CType(rptRequestForm.FindControl("txtBox"), TextBox) 
+0

त्रुटि संदेश: 'टेक्स्टबॉक्स' एक प्रकार है और अभिव्यक्ति के रूप में उपयोग नहीं किया जा सकता है। – Frank

+0

मैंने अपना उत्तर VB.Net कोड के साथ अपडेट किया है। –

+0

जब तक स्विच बंद नहीं हो जाता है, तो वीबी आपको ओपी के रूप में अंतर्निहित कास्टिंग करने देता है। –

1
Dim myText as string 
Dim j As Integer = 0 

'की पुष्टि करें उपयोगकर्ता कम से कम एक मात्रा में प्रवेश किया है, तो

For Each myItem as repeateritem In rptRequestForm.Items 
    If NOT string.isnullorempty(CTYPE(myItem.FindControl("txtBox"),textbox).text) then 
     j += 1 
    End If 
Next 

मैं कुछ भी नहीं का उपयोग नहीं होगा - यकीन नहीं है कि कोई समस्या है या कारण बनता है, लेकिन आम तौर पर मुझे लगता है कि वस्तुओं के लिए, गुण नहीं । String.IsNullOrNothing() शून्य या खाली ("") के लिए तारों की जांच के लिए किया गया है।

आपको इस बारे में चिंता करने की आवश्यकता नहीं है कि टेक्स्टबॉक्स मौजूद है या नहीं, क्योंकि यदि यह दोहराने की एक पंक्ति में मौजूद है, तो यह सभी पंक्तियों में मौजूद होगा। मुझे लगता है कि आप इसे 'कुछ भी नहीं' के लिए देख सकते हैं अगर आपको यकीन नहीं था कि "txtbox" डिज़ाइन समय पर क्या था ... लेकिन अन्यथा, आवश्यक नहीं है।

आपको निश्चित रूप से कास्ट (CTYPE()) का उपयोग करना चाहिए। मुझे लगता है कि यदि आप चाहें तो इसका उपयोग न करने में सक्षम हो सकते हैं .text, लेकिन CTYPE आपको सभी टेक्स्टबॉक्स के गुणों तक पहुंच प्रदान करता है (केवल यह विरासत गुण नहीं है), और आपको चेकबॉक्स भी करना पड़ सकता है या कुछ बिंदु पर अन्य नियंत्रण जहां काफी क्रम में CTYPE करने के लिए है .ischecked के लिए सेट के लिए संपत्ति दिखाई पाने के लिए आदि

+0

एक ही त्रुटि संदेश (तब होता है जब यह "स्ट्रिंग नहीं है ...) ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट के उदाहरण पर सेट नहीं है – Frank

+0

@ फ्रैंक - आप मौके के अंदर ऐसा नहीं कर रहे हैं पेज आप हैं? (यदि हां, तो "क्लाइंट आईडी" सेट करने का प्रयास करें।) – Chains

+0

नहीं ... कोई मास्टर पेज – Frank

0

मैं एक सामान्य विधि बनाया है, मुझे लगता है कि आप एक उदाहरण के रूप में यह ले जा सकते हैं

Sub SetVisibleControlRepeater(ByRef repetidor As Repeater, ByVal idControl As String, ByVal esVisible As Boolean) 

     For Each item As RepeaterItem In repetidor.Items 

      Dim boton As System.Web.UI.WebControls.Button = CType(item.FindControl(idControl), Button) 

      boton.Visible = esVisible 

     Next 

    End Sub