webForumDet fria alternativet

Problem med instans av objekt?

15 svar · 631 visningar · startad av Vimp

VimpMedlem sedan juli 20022 537 inlägg
#1

Hej,

Jag tänkte göra en funktion som byter ut flera strängar mot andra, d.v.s som en mer avancerad Replace()-funktion.

Jag får för tillfället följande felmeddelande:

Objektreferensen har inte angetts till en instans av ett objekt.

Klassen ser ut på följande sätt:

Namespace test

    Public Class testing

        Private Function ReplaceString(ByVal StringToReplace As String) As String
            Dim tmpString As String = StringToReplace
            tmpString = tmpString.Replace("0", "noll")
            tmpString = tmpString.Replace("1", "ett")
            tmpString = tmpString.Replace("2", "två")
            tmpString = tmpString.Replace("3", "tre")
            tmpString = tmpString.Replace("4", "fyra")
            tmpString = tmpString.Replace("5", "fem")
            tmpString = tmpString.Replace("6", "sex")
            tmpString = tmpString.Replace("7", "sju")
            tmpString = tmpString.Replace("8", "åtta")
            tmpString = tmpString.Replace("9", "nio")
            Return tmpString
        End Function

        Public Property Banan(ByVal strText As String) As String
            Get
                Return ReplaceString(Banan)
            End Get
            Set(ByVal Value As String)
                strText = Value
            End Set
        End Property

    End Class

End Namespace

Code-Behind-filen där jag skapar en instans av "testing" ser ut på följande sätt:

...
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim testClass As New testing()
        Literal1.Text = testClass.Banan("1234567890")
    End Sub
...

Felmeddelandet tyder på tatt det är tmpString = tmpString.Replace("0", "noll") det är fel på.

renholmMedlem sedan apr. 20012 266 inlägg
#2

Har inte så stor kolla på VB.NET men tyckte att din Propertie ser konstig ut, har för mig att man ska använda value objektet för att sätta värden. Dessutom tror jag inte properties kan ta argument utan det du använder ser ut att vara en funktion. Men som jag sa tidigare kan jag inte VB.NET något vidare. Däremot vet jag att frågan inte är någon ASP.NET specifik fråga, flyttas därför till .NET-forumet.

Engine^Medlem sedan dec. 20003 887 inlägg
#3

Ska du använda dig av properties måste du nog göra såhär

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Dim testClass As New testing()

  testClass.Banan = "1234567890"
  Literal1.Text = testClass.Banan
End Sub

Annars måste du skapa en metod eller en konstruktor som tar en sträng som argument.

VimpMedlem sedan juli 20022 537 inlägg
#4

Fungerar fortfarande inte :(
Får följande felmeddelande i VS.NET:
c:\inetpub\wwwroot\CyberZone\default.aspx.vb(25): Argument not specified for parameter 'strText' of 'Public Property Banan(strText As String) As String'.

På aspx-sidan är det fortfarande samma fel.

DinoMedlem sedan sep. 20011 914 inlägg
#5

Om jag kommer ihåg min vb.net rätt så skall det väl se ut så här?

private _Banan as string
Public Property Banan() As String
   Get
      Return _Banan
   End Get
   Set(ByVal Value As String)
      _Banan = ReplaceString(Value)
   End Set
End Property
VimpMedlem sedan juli 20022 537 inlägg
#6

Det händer ingenting nu.
Inget felmeddelande (YES! ;) ), men samtidigt kommer ingen text =(
Hur ska jag skicka med värdet där?
Ska jag lägga till t.ex. strText As String i Banan() ?

DinoMedlem sedan sep. 20011 914 inlägg
#7

Gör som Engine^ skrev.

VimpMedlem sedan juli 20022 537 inlägg
#8

ÅÅhhh.. ni är ju underbara :e
Fungerar perfekt :e
Puss på er :f

:birp :birp :birp

VimpMedlem sedan juli 20022 537 inlägg
#9

Nu försöker jag göra om koden så att den läser in en XML-fil som innehåller alla strängar som ska bytas ut.
I XML-filen har jag <OldText> som innehåller den strängen som ska bytas ut och <NewText> som innehåller den nya strängen.
De ligger i sin tur i <TextToReplace>.

Jag vet dock ej hur jag ska göra för att sedan byta ut alla OldText mot NewText.
Är det någon som kan ge mig något att gå på?

DinoMedlem sedan sep. 20011 914 inlägg
#10

Får kolla på det sen, men kan du visa xml filen och hur du tar ut/in datan

VimpMedlem sedan juli 20022 537 inlägg
#11

Jag skickar med alla koder.
Jag har inte hunnit fixa allt som det ska vara så det ligger kanske kvar lite skitkoder.
Men jag är tacksam för att du tar dig tid och kollar igenom detta :)

replace.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<TextToReplace>
	<Text>
		<OldText>1</OldText>
		<NewText>ett</NewText>
	</Text>
	<Text>
		<OldText>2</OldText>
		<NewText>två</NewText>
	</Text>
	<Text>
		<OldText>3</OldText>
		<NewText>tre</NewText>
	</Text>
	<Text>
		<OldText>4</OldText>
		<NewText>fyra</NewText>
	</Text>
	<Text>
		<OldText>5</OldText>
		<NewText>fem</NewText>
	</Text>
</TextToReplace>

Test.vb

Imports System
Imports System.Web
Imports System.Web.UI

Namespace Common

    Public Class Replace : Inherits Control

#Region " Functions "

        Private Function ReadXML(ByVal Source As String) As String
            Dim DS As New DataSet()
            DS.ReadXml(_Source)

            Dim i As Integer
            Dim tmpA As String
            Dim tmpB As String
            Dim strXML As String

            For i = 0 To DS.Tables("TextToReplace").Rows.Count()
                tmpA = DS.Tables("TextToReplace").Columns("OldText")
                tmpB = DS.Tables("TextToReplace").Columns("NewText")
                Source = Source.Replace(tmpA, tmpB)
            Next

            Return Source
        End Function

        Private Function ReplaceString(ByVal StringToReplace As String) As String
            Dim tmpString As String = StringToReplace
            tmpString = tmpString.Replace("0", "noll")
            tmpString = tmpString.Replace("1", "<a href=""http://www.cyberzone.se"" target=""_blank"">CyberZone aeger</a>")
            tmpString = tmpString.Replace("2", "två")
            tmpString = tmpString.Replace("3", "tre")
            tmpString = tmpString.Replace("4", "fyra")
            tmpString = tmpString.Replace("5", "fem")
            tmpString = tmpString.Replace("6", "sex")
            tmpString = tmpString.Replace("7", "sju")
            tmpString = tmpString.Replace("8", "åtta")
            tmpString = tmpString.Replace("9", "nio")
            Return tmpString
        End Function

#End Region

#Region " Properties "

        Private _Replace As String
        Public Property Text() As String
            Get
                Return _Replace
            End Get
            Set(ByVal Value As String)
                '_Replace = ReplaceString(Value)
                _Replace = ReplaceString(Value)
            End Set
        End Property

        Private _Source As String
        Public Property Source() As String
            Get
                Return _Source
            End Get
            Set(ByVal Value As String)
                _Source = Value
            End Set
        End Property

#End Region

#Region " Output "
        Protected Overrides Sub Render(ByVal Output As HtmlTextWriter)
            Output.Write(_Replace)
        End Sub
#End Region

    End Class 'Replace

End Namespace 'Common

default.aspx

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="default.aspx.vb" Inherits="CyberZone.WebForm1"%>
<%@ Register TagPrefix="CyberZone" Namespace="CyberZone.Common" Assembly="CyberZone" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
	<HEAD>
		<title>WebForm1</title>
		<meta content="Microsoft Visual Studio.NET 7.0" name="GENERATOR">
		<meta content="Visual Basic 7.0" name="CODE_LANGUAGE">
		<meta content="JavaScript" name="vs_defaultClientScript">
		<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
	</HEAD>
	<body MS_POSITIONING="GridLayout">
		<form id="Form1" method="post" runat="server">
			<CyberZone:Replace Text="String 123" runat="server" id="Replace1" />
		</form>
	</body>
</HTML>
VimpMedlem sedan juli 20022 537 inlägg
#12

Jag kan säga direkt att jag inte har hunnit fixa till loopen där den ska byta ut informationen i XML-filen..

//Edit
Innehållet i funktionen replacestring är bara temporärt.
Det ska inte användas när allt är klart.

DinoMedlem sedan sep. 20011 914 inlägg
#13

Om du bara skall byta ut OldText till NewText så borde väl modifierad version av ReadXML funka.

For i = 0 To DS.Tables("TextToReplace").Rows.Count()
   tmpA = DS.Tables("TextToReplace").Columns("OldText")
   tmpB = DS.Tables("TextToReplace").Columns("NewText")
   [b]DS.Tables("TextToReplace").Columns("OldText") = tmpB[/b]
   Source = Source.Replace(tmpA, tmpB)
Next

[b]DS.WriteXml(_Source)[/b]
VimpMedlem sedan juli 20022 537 inlägg
#14

I default.aspx har jag denna kod:

<CyberZone:Replace Text="String 123" runat="server" id="Replace1" />

I "Text" vill jag skicka in en sträng.
Sen ska jag ha en loop som kollar igenom XML-filen och om något i strängen finns som OldText i XML-filen ska det bytas ut mot NewText.
Sen ska jag skriva ut den modifierande texten.
Jag vill alltså inte skriva till XML-filen, utan endast läsa in värdena från den.

VimpMedlem sedan juli 20022 537 inlägg
#15

Nu har jag kommit lite längre..
Funderar på att använda XmlDataDocument() eller XmlTextReader() nu.

Jag skickar med koden för test.vb här:

Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Xml
Imports System.Data

Namespace Common

    Public Class Replace : Inherits Control

#Region " Properties "

        Private _Replace As String
        Public Property Text() As String
            Get
                Return _Replace
            End Get
            Set(ByVal Value As String)
                '_Replace = ReadXML(_Source, Value)
                _Replace = ReadXML2(_Source, Value)
            End Set
        End Property

        Private _Source As String
        Public Property Source() As String
            Get
                Return _Source
            End Get
            Set(ByVal Value As String)
                _Source = Value
            End Set
        End Property

#End Region

#Region " Functions "

        Private Function ReadXML(ByVal Source As String, ByVal Text As String) As String
            Dim XMLDoc As New XmlDataDocument()

            'Try
            XMLDoc.DataSet.ReadXml(Source)
            Dim i As Integer
            Dim tmpA, tmpB As String
            Dim strXML As String

            For i = 0 To XMLDoc.DataSet.Tables("TextToReplace").Columns.Count - 1
                tmpA = XMLDoc.DataSet.Tables(0).Columns(i).Caption
                tmpB = XMLDoc.DataSet.Tables(0).Columns(i).Caption
                Text = Text.Replace(tmpA, tmpB)
            Next
            'Catch
            'Throw New Exception("Ett fel uppstod.")
            'End Try

            Return Text
        End Function

        Private Function ReadXML2(ByVal Source As String, ByVal Text As String) As String
            Dim reader As XmlTextReader
            Dim tmpA As Integer
            Dim tmpB As Integer

            reader = New XmlTextReader(Source)

            While reader.Read
                tmpA = reader.Value
                reader.MoveToNextAttribute()
                tmpB = reader.Value
                Text = Text.Replace(tmpA, tmpB)
            End While

            Return Text
        End Function

#End Region

#Region " Output "
        Protected Overrides Sub Render(ByVal Output As HtmlTextWriter)
            Output.Write(_Replace)
        End Sub
#End Region

    End Class 'Replace

End Namespace 'Common

Som ni ser har jag två olika funktioner där.
Jag tycker själv att readxml2 verkar stabilast. ;)

På default.aspx kör jag denna lilla snutt..

<CyberZone:Replace Text="String 123" Source="c:\inetpub\wwwroot\CyberZone\replace.xml" runat="server" />

Problemet nu är att det någonstans i koden blir fel :q
Får detta felmeddelande:

Sökvägen har inte ett giltigt format.

Den syftar på rad 64 i test.vb.

Rad 62:             Dim tmpB As Integer
Rad 63: 
Rad 64:             reader = New XmlTextReader(Source)
Rad 65: 
Rad 66:             While reader.Read

Det verkar som sökvägen skickas in på ett felaktigt sätt.
Vore tacksam för ledtrådar som leder till att jag kan lösa detta!

//Mikael Söderström

DinoMedlem sedan sep. 20011 914 inlägg
#16

Koden är inte testad, men den borde funka tycker jag.

Public Class Replace : Inherits Control

   Private _text, _source As String

   Public Property Text() As String
      Get
         Return _text
      End Get
      Set(ByVal Value As String)
         _text = ReplaceString(Value, Source)
      End Set
   End Property

   Public Property Source() As String
      Get
         Return _source
      End Get
      Set(ByVal Value As String)
         _source = Value
      End Set
   End Property

   Function ReplaceString(ByVal TextString As String, ByVal DataSource As String) As String
      Dim sOld As String()
      Dim sNew As String()
      Dim x As Integer = 0

      Dim xdrData As New XmlTextReader(HttpContext.Current.Server.MapPath(DataSource))
      While xdrData.Read()
         If xdrData.NodeType = XmlNodeType.Element Then
            Select Case xdrData.Name
               Case "OldText"
                  sOld(x) = xdrData.ReadString
               Case "NewText"
                  sNew(x) = xdrData.ReadString
                  x += 1
            End Select
         End If
      End While
      xdrData.Close()

      For i As Integer = 0 To sNew.Length - 1
         TextString = TextString.Replace(sOld(i), sNew(i))
      Next
      Return TextString
   End Function

   Protected Overrides Sub Render(ByVal Output As HtmlTextWriter)
      Output.Write(Text)
   End Sub

End Class
145 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)