• 0

[VB.NET]Listbox string replace


Question

First of all Happy New Year Neowins.

The program gets the following string in db.lib NAME > URL

For Example:


GOOGLE > http://google.com
[/CODE]

When i start my form loads the whole db.lib file in listbox1 like this:

listbox.png

after that when i double click it will open me http://google.com because i split it with this tag (">")

[CODE]
Dim arg() As String
For i As Integer = 0 To ListBox1.Items.Count
arg = ListBox1.SelectedItem.ToString.Split(">")
Next
[/CODE]

My question is: How can i hide the url addres ("http://") in list box to show only the name Google and when i click it to open http://google.com - Thanks

Btw this program gets the mms: protocol (most used for Online TV) and play it in VLC player.

The whole code:

[CODE]
Imports System.Net
Imports System.IO
Imports System.Web
Public Class Form1
Dim i As Integer
Private Sub ??????ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ??????ToolStripMenuItem.Click
Dim inp As String = InputBox("???? ??? ??????????", "???????", vbOKCancel)
If inp <> "" Then
ListBox1.Items.Add(inp)
End If
End Sub
Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
My.Settings.path = Label1.Text
Dim w As New System.IO.StreamWriter("db.lib")
Dim i As Integer
For i = 0 To ListBox1.Items.Count - 1
w.WriteLine(ListBox1.Items.Item(i))
Next
w.Close()
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Label1.Text = My.Settings.path
Dim r As New System.IO.StreamReader("db.lib")
While (r.Peek() > -1)
ListBox1.Items.Add(r.ReadLine)
End While
r.Close()
End Sub
Private Sub ListBox1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.DoubleClick
Dim Client As New WebClient
Dim arg() As String
For i As Integer = 0 To ListBox1.Items.Count
arg = ListBox1.SelectedItem.ToString.Split(">")
Next
Try
Dim html = Client.DownloadString(New Uri(arg(i + 1)))
Client.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)")
Try
Dim StartPos As Integer = html.IndexOf("mms")
Dim EndPos As Integer = html.IndexOf("</object>", StartPos)
Dim finaloutcome As String = html.Substring(StartPos, EndPos - StartPos)
Dim Key As String = (finaloutcome.Substring(0, 90))
Dim Last As String = Key.Replace(""">", "")
Dim all As String = Last.Replace("<pa", "")
If Label1.Text = "" Then
MsgBox("Please coose the folder to your VLC Player!")
Else
Shell(Label1.Text & "\vlc.exe " & all)
End If
Catch ex As Exception
MsgBox("This link does not support mms protocol!")
End Try
Catch ex As Exception
MsgBox("I cant connect to the website!")
End Try
End Sub
Private Sub VLCPlayerToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VLCPlayerToolStripMenuItem.Click
FolderBrowserDialog1.ShowDialog()
Label1.Text = FolderBrowserDialog1.SelectedPath
My.Settings.path = Label1.Text
My.Settings.Save()
End Sub
End Class
[/CODE]

Link to comment
https://www.neowin.net/forum/topic/1128630-vbnetlistbox-string-replace/
Share on other sites

16 answers to this question

Recommended Posts

  • 0

You could have an array of all your sites that when clicked in the list it goes to that index and launches the site that's in that index. So what you would end up doing, is dump the db.lib thing into an array (splitting at the > and grabbing the second index) and at the same time put the first split index into the list box.

Then have a Click, or Selected Index Changed event. And just do like:

LaunchSite(siteUrls[lstSites.SelectedIndex]) 'Replacing functions/names accordingly

  • 0

I think what Firey means is to create a class member that is an array, and keep your URLs in there separately. So in your class you'd do this (please note, my VB is very rusty, so this will probably not compile, but it should give you an idea as to what to do):

Imports System.Net
Imports System.IO
Imports System.Web
Imports System.Collections.Generic

Public Class Form1
	Private m_urls As List(Of String)

	' We'll use this subroutine to add the site to both the listbox and the list of URLs.
	Private Sub AddSiteToList(ByVal siteString As String)
		Dim stringParts() As String = str.Split("&gt;")

		If stringParts.Length &lt;&gt; 2 Then
			Throw New ArgumentException("Parameter 'siteString' was an unexpected format (value: '" + siteString + "'). Please make sure string is of the format '[Site_Name]&gt;[URL]'")
		End If

		ListBox1.Items.Add(stringParts(0))
		m_urls.Add(stringParts(1))
	End Sub

	' We'll use this function to retrieve the URL for the selected item.
	Private Function GetSelectedUrl() As String
		If ListBox1.SelectedIndex &gt; -1 Then
			GetSelectedUrl = m_urls(ListBox1.SelectedIndex)
		Else
			GetSelectedUrl = ""
		End If
	End Function

	Private Sub ??????ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ??????ToolStripMenuItem.Click
		Dim inp As String = InputBox("???? ??? ??????????", "???????", vbOKCancel)
		If inp &lt;&gt; "" Then
				AddSiteToList(inp)
		End If
	End Sub


	Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
		My.Settings.path = Label1.Text
		Dim w As New System.IO.StreamWriter("db.lib")
		For i As Integer = 0 To ListBox1.Items.Count - 1
			w.WriteLine(ListBox1.Items.Item(i) + "&gt;" + m_urls(i))
		Next
		w.Close()
	End Sub

	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
		Label1.Text = My.Settings.path
		Dim r As New System.IO.StreamReader("db.lib")
		While (r.Peek() &gt; -1)
				AddSiteToList(r.ReadLine)
		End While
		r.Close()
	End Sub

	Private Sub ListBox1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.DoubleClick
		Dim url As String = GetSelectedUrl()

		If url.Length &gt; 0 Then
			Try
				Dim Client As New WebClient
				Dim html = Client.DownloadString(New Uri(url))
				Client.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)")
				Try
					Dim StartPos As Integer = html.IndexOf("mms")
					Dim EndPos As Integer = html.IndexOf("", StartPos)
					Dim finaloutcome As String = html.Substring(StartPos, EndPos - StartPos)
					Dim Key As String = (finaloutcome.Substring(0, 90))
					Dim Last As String = Key.Replace("""&gt;", "")
                                        Dim all As String = Last.Replace("&lt;pa", "")
					If Label1.Text = "" Then
						MsgBox("Please coose the folder to your VLC Player!")
					Else
						Shell(Label1.Text &amp; "\vlc.exe " &amp; all)
					End If
				Catch ex As Exception
					MsgBox("This link does not support mms protocol!")
				End Try
			Catch ex As Exception
				MsgBox("I cant connect to the website!")
			End Try
		End If
	End Sub

	Private Sub VLCPlayerToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VLCPlayerToolStripMenuItem.Click
		FolderBrowserDialog1.ShowDialog()
		Label1.Text = FolderBrowserDialog1.SelectedPath
		My.Settings.path = Label1.Text
		My.Settings.Save()
	End Sub
End Class

  • 0

Personally, I'd have them split on reading from the db.lib file into a key/value pair with the DisplayMember property of the list box set to the key (name of site) and the ValueMember property of list box set to the value (the url) then assign the collection of key/value pairs to the listbox items collection...

Really can't be bothered to write up a sample though...

  • 0

Personally, I'd have them split on reading from the db.lib file into a key/value pair with the DisplayMember property of the list box set to the key (name of site) and the ValueMember property of list box set to the value (the url) then assign the collection of key/value pairs to the listbox items collection...

Really can't be bothered to write up a sample though...

That probably would be better, but I picked the easiest solution requiring the fewest changes :p

  • 0

That probably would be better, but I picked the easiest solution requiring the fewest changes :p

Well, should also note it'd be more ideal to move any non-UI code out of the Form class into it's own class(es) too... so may as well re-architect it a little more anyway... *shrugs*

  • 0

Not for the sake of < 100 LoC it wouldn't. KISS.

Right, I agree with KISS - however this looks like an educational application (as in one he's working on to learn rather than just a quick fix from someone who knows concepts); in which case I deem it more useful to practice correctly laying out your code as you would for a larger application.

Once people get set in lazy ways they tend to stay in them.

  • 0

I agree that in general code should be split out as much as possible (Gui with Gui, logic with logic). Though he doesn't seem to have strong knowledge with the programming, so it would end up just causing more headaches to go and re-do all his code for him. As he won't understand what the program does.

  • 0

best of using a listbox tag of your item for the url and open the tag keeping the item intact.

listbox.Items(i).Tag = "http://www.google.com"[/CODE]

Indeed that would be better. In my defence the last time I used a ListBox in Windows Forms .NET 3 hadn't gained any traction yet :p

This topic is now closed to further replies.
  • Posts

    • Yeah, when I saw that, I wanted to find the nearest nose. You can't find a good nose these days when you need one.
    • Anthropic launches Claude Fable 5, a state-of-the-art AI model that beats OpenAI's GPT-5.5 by Pradeep Viswanathan Back in April, Anthropic announced Claude Mythos Preview, a frontier model with state-of-the-art coding capabilities. Due to the cybersecurity implications that would occur due to the availability of such a powerful model, Anthropic made it available to only a select set of companies around the world. The company's plan was to prepare appropriate guardrails before releasing such a powerful model to everyone. Now, after nearly two months, Anthropic announced Claude Fable 5, its most capable AI model yet for general users. The company also announced Claude Mythos 5, the same underlying model as Fable 5, but with safeguards lifted, making it more suitable for selected cybersecurity and biology use cases. Claude Fable 5 sits a tier above its Opus models and it beats most other generally available models across areas including software engineering, knowledge work, vision, scientific research, and long-running autonomous tasks. To prevent model misuse, when Claude Fable 5 detects certain requests related to cybersecurity, biology, chemistry, or model distillation, the request will be routed to the Claude Opus 4.8 model. Anthropic claims that these safeguards trigger in less than 5% of sessions on average. However, for large organizations working on critical software, Claude Mythos 5 can be availed through Project Glasswing. Later, Anthropic has plans to expand access through a broader trusted access program. As you can notice in the benchmarks above, Fable 5 and Mythos 5 are state-of-the-art on most key AI benchmarks and they are well ahead of OpenAI's frontier model, GPT-5.5. For example, Fable 5 is the new state-of-the-art model for vision tasks. Also, Mythos 5 has the strongest cybersecurity capabilities of any model in the world. Claude Fable 5 and Claude Mythos 5 are priced at $10 per million input tokens and $50 per million output tokens, which is less than half the price of Claude Mythos Preview. Another big change is that Anthropic is making a change to the way they handle business customer data for both Fable 5 and Mythos 5 models. The company will now require 30-day retention for all traffic on both first- and third-party surfaces. Anthropic promises that it won't use the data to train Claude models, instead it will use it against complex and novel attacks. Claude Fable 5 is available today on the Claude API and consumption-based Enterprise plans. It is also included at no extra cost for Pro, Max, Team, and seat-based Enterprise customers from today through June 22. After that, users on those plans will need usage credits to continue using Fable 5, unless Anthropic extends the included access window based on capacity. Developers can access Fable 5 through the Claude API using the claude-fable-5 model name.
    • Dragon's Dogma 2: Dark Arisen expansion to bring snowy region, new updates also coming by Pulasthi Ariyasinghe Capcom had a surprise waiting for Dragon's Dogma fans today in the Nintendo Direct presentation. The company revealed an expansion for the second installment with a name that should be familiar to series veterans. Coming later this year, Dragon's Dogma 2: Dark Arisen is promising a massive new region to explore, new monsters, fresh skills to learn, and more. The studio says players will be heading to the Northern region of the world, named Norgan, to find new secrets about an undying "Fallen Dragon." There will be forgotten relics that the protagonist can find to unlock fresh weapons and skills the expansion is introducing. Players will also be able to find mysterious equipment from a previous Arisen as a part of the expansion, all part of 12 Lost Rites Dungeon Challenges they must complete to gain access. In Neowin's own review, I found Dragon's Dogma 2 to be an impressive RPG when it launched back in 2024, giving the title an 8.5/10 for its class variants, companion system, and immersive exploration. "Once a prosperous region of the kingdom of Vermund, it was abandoned many years ago for reasons unknown," says Capcom about the new region. "Long has it been since any soul traveled its paths. Blanketed in heavy snow, these frigid lands are home to savage hordes and creatures of unbelievable power. Those who are capable of vanquishing such fearsome foes, or those who possess a keen eye for exploration, will find themselves rewarded with powerful relics." Dragon’s Dogma 2: Dark Arisen expansion launches on October 9, 2026, with a $29.99 price tag. Ahead of the expansion release, Capcom is also planning to release two free updates to the base game. The first will land tomorrow, June 10, bringing more accessible fast travel with an Eternal Ferrystone and other quality-of-life adjustments. The second update will land sometime in August, aiming to improve frame rates, add more save slots, and bring even more community-requested adjustments. This expanded Dark Arisen edition is also launching on the Nintendo Switch 2 on the same day the content comes to PC, Xbox Series X|S, and PlayStation 5.
  • Recent Achievements

    • Week One Done
      rubentuben8 earned a badge
      Week One Done
    • Week One Done
      ARaclen earned a badge
      Week One Done
    • One Year In
      jojodbn earned a badge
      One Year In
    • One Month Later
      jojodbn earned a badge
      One Month Later
    • Week One Done
      jojodbn earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      525
    2. 2
      PsYcHoKiLLa
      231
    3. 3
      +Edouard
      124
    4. 4
      ATLien_0
      87
    5. 5
      Steven P.
      83
  • Tell a friend

    Love Neowin? Tell a friend!