Avatar billede thomas-k Nybegynder
16. december 2007 - 01:40 Der er 20 kommentarer og
1 løsning

Link i C# program

Jeg er ved at lave et program, hvor jeg gerne vil have et link på en af mine labels, men det lykkes ikke helt. Jeg laver fx dette:

label1.Text = "<a href=''>" + lvsi1.Text + "</a>;

- men dette virker selvfølgelig ikke, da den jo bare skriver det som tekst. Kan det lade sig gøre på en eller anden vis?
Avatar billede kalp Novice
16. december 2007 - 03:10 #1
kig i toolboksen.. der er også noget som hedder linklabel..
Avatar billede baxos Nybegynder
16. december 2007 - 04:53 #2
Ellers kan du vel os bare smide noget kode i OnClick event?
Avatar billede thesurfer Nybegynder
16. december 2007 - 08:04 #3
Linklabel som nævnt i 16/12-2007 03:10:48.. :-)
Avatar billede tjacob Juniormester
16. december 2007 - 10:10 #4
Linklabel giver dig noget funktionalitet omkring selve linket, så det ligner et link på en webside, det kan f.eks. skifte farve når det er brugt m.m.

Selve funktionaliteten med at åbne linket i en Browser, skal du selv skrive, så for så vidt kan du lige så godt gøre det i en almindelig label.

Læg denne kode i click eventet:

    Try
        System.Diagnostics.Process.Start("www.Eksperten.dk")   
    Catch
        MsgBox("Linket kunne ikke åbnes")
    End Try

Jeg er ikke 100% på syntaksen, da dette er VB.NET, men mon ikke det er det samme i C#?
Avatar billede kalp Novice
16. december 2007 - 10:38 #5
Syntax er selvfølgelig ikke den samme, men det er samme API så ja
det er korrekt med dette

System.Diagnostics.Process.Start("www.Eksperten.dk");

efterfulgt af ; for at overholde C# syntax:)
Avatar billede thomas-k Nybegynder
16. december 2007 - 12:08 #6
Takker for svarene. Da jeg er meget ny til C# har jeg lige brug for lidt hjælp. Jeg har nu lavet denne:

protected void linkLabel1_LinkClicked(object sender, System.EventArgs e)
        {
            System.Diagnostics.Process.Start("www.Eksperten.dk");
        }

Men hvordan hulen hiver jeg lvsi1.Text ind i stedet for "www.eksperten.dk" så det kan blive dynamisk. Her er min kode:

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            ListView li = (ListView)sender;
            if (li.SelectedItems.Count > 0)
            {
                this.groupBox1.Visible = true;
                ListViewItem lvi = li.SelectedItems[0];
                ListViewItem.ListViewSubItem lvsi1 = lvi.SubItems[0];
                linkLabel1.Text = lvsi1.Text; 
            }
        }
Avatar billede bitmatic Nybegynder
16. december 2007 - 12:16 #7
System.Diagnostics.Process.Start(linkLabel1.Text);

eller

System.Diagnostics.Process.Start(lvsi1.Text);
Avatar billede thomas-k Nybegynder
16. december 2007 - 12:28 #8
Nej, for så kommer der fejl. Den kender jo ikke til lvsi1, da den kommer fra: private void listView1_SelectedIndexChanged(object sender, EventArgs e). Så hvorledes hiver jeg fat i denne fra: protected void linkLabel1_LinkClicked(object sender, System.EventArgs e).
Avatar billede thesurfer Nybegynder
16. december 2007 - 13:01 #9
Det nemmeste ville vel være at lave en metode, der bare står for afvikling af internet-adresser..

Eksempel:

private void HentSide(string url)
{
System.Diagnostics.Process.Start(url);
}

Den kan du så kalde med:

HentSide("http://www.eksperten.dk");

Alternativet kan du gøre brug af "Tag" attributten, som findes på alle controls.

Eksempel:


protected void linkLabel1_LinkClicked(object sender, System.EventArgs e)
        {
if (linkLabel1.Tag.ToString() != "") System.Diagnostics.Process.Start(linkLabel1.Tag.ToString());
        }

Så kan du gøre sådan her (f.eks. i listView1_SelectedIndexChanged):

linkLabel1.Tag = "http://www.eksperten.dk";

Når man så klikker på LinkLablen, ser den om der står noget i "Tag"-egenskaben. Hvis der gør det, åbner det det (adressen) som står i "Tag"-egenskaben.

Jeg håber at det løser problemet.. ellers må du lige skrive hvad der er galt osv.. :-)
Avatar billede thomas-k Nybegynder
17. december 2007 - 08:53 #10
Jeg tester lige når jeg kommer hjem i dag og vender tilbage.
Avatar billede thomas-k Nybegynder
17. december 2007 - 22:17 #11
Hmm, ved ikke om jeg gør det forkert. For på ovenstående måde er det jo ikke dynamisk, vel? Det virker hvis jeg skriver dit tag eksempel, men hhvorledes skiftes "http://eksperten.dk" ud med lvsi1.Text? Ud fra mit hovede vil jeg have at der skal stå:

protected void linkLabel1_LinkClicked(object sender, System.EventArgs e)
{
if (linkLabel1.Tag.ToString() != "") System.Diagnostics.Process.Start(linkLabel1.Tag.ToString());
}

Og dernæst i listView1_SelectedIndexChanged:

linkLabel1.Tag = lvsi1.Text;

- men dette giver fejl og siger at den angivne fil ikke kan findes.
Avatar billede thesurfer Nybegynder
17. december 2007 - 22:55 #12
Hvad står der helt præcist i lvsi1.Text ?

Husk at starte alle dine links med "http://". Det er vigtigt.
Avatar billede thesurfer Nybegynder
17. december 2007 - 22:56 #13
PS:

Fejlen opstår højst sandsynligt her:

.Start(linkLabel1.Tag.ToString());

Hvis "linkLabel1.Tag.ToString()" ikke indeholder noget den kan finde ud af (enten filnavn eller "http://....."), melder den fejl..

Da System.Diagnostics.Process.Start normalt bruges til at starte programmer op, vil den naturligvis gå ud fra, at du har angivet et forkert filnavn.. :-)
Avatar billede thomas-k Nybegynder
17. december 2007 - 23:03 #14
:-) suuuper. Det var mig der var for hurtig. Så snart der blev smidt et http:// foran virkede det. Smider du ikke et svar til mig.
Avatar billede thesurfer Nybegynder
17. december 2007 - 23:06 #15
Jo, det gør jeg da :-)
Avatar billede thesurfer Nybegynder
17. december 2007 - 23:06 #16
Jeg deler gerne med kalp.
Avatar billede thomas-k Nybegynder
17. december 2007 - 23:10 #17
Jamen, så venter jeg lige lidt på kalp hvis han vil være med.
Avatar billede jimmydk Nybegynder
02. januar 2008 - 20:06 #18
using System;
using System.Data;
using System.Data.OleDb;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class Presse : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        {
            OleDbConnection MyConnection = new OleDbConnection();
            MyConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|DATABASEN.mdb";

            string strSQL = String.Format("Select * from TABEL");

            OleDbCommand objCommand = new OleDbCommand(strSQL, MyConnection);
            OleDbDataReader objDataReader = null;

            try
            {
                MyConnection.Open();
                objDataReader = objCommand.ExecuteReader();


                while (objDataReader.Read() == true)
                {
                    //Her gør vi filnavnet til et link så filen kan ses/hentes
                    FilerL.Text += "<a href='" + "MAPPE/" + Convert.ToString(objDataReader["Filnavn"]) + " 'target=_blank'  id='link'" + "'>" + Convert.ToString(objDataReader["Filnavn"]) + "</a>" + "<br>";
                   



                }
                MyConnection.Close();
                objDataReader.Close();
            }

            catch (Exception exept)
            {
                Fejl.Text = Convert.ToString(exept);

            }
        }
    }
}


Den her virker
Avatar billede thesurfer Nybegynder
02. januar 2008 - 21:09 #19
jimmydk> Forkert spørgsmål/tråd? :-)
Avatar billede thesurfer Nybegynder
02. januar 2008 - 21:28 #20
Jeg kan ikke lade vær med at kigge koden igennem, og har nogle kommentar til den.. :-)

Fra top og til bund (håber ikke at jeg glemmer noget)..:

1)
Når man bruger "", er det automatisk en streng, og man behøver derfor ikke "String.Format".


2)
Din Try/Catch struktur er lidt forkert, da du ikke får lukke for forbindelsen, hvis noget går galt EFTER linien "MyConnection.Open();". Dvs, går der noget galt i f.eks. "objDataReader = objCommand.ExecuteReader();", hopper den over i Catch-delen, og forbindelsen lukkes IKKE.
Derfor skal du altid lukke forbindelsen i Finally, hvilket altid bliver afviklet.
Med andre ord:

try
{

// åben forbindelsen

} catch (...) {

// fejlhåndtering

} finally {

// luk forbindelsen

}


3)
Ja, det er mere pædagogisk at bruge "== true" for at teste om en betingelse er sand, men ikke nødvendigt i C#.
Dvs, følgende er nok:

while (objDataReader.Read())

4)

Så vidt jeg ved, har OleDbDataReader (og alle de andre read'ere) en ".ToString()" funktion/egenskab.
Det betyder at du ikke behøver "Convert.ToString", men kan nøjes med at skrive:

objDataReader["Filnavn"].ToString()


5)

"e" bruges til "event arguments". Pga dette, kan man ikke bruge "e" til "exception" i Catch-delen.
Derfor bruger man normalt "ex".
Denne "exception" har en "Message" attribut/egenskab, som indeholder hele fejlbeskrivelsen.
"Message" returnerer en streng ("string") og behøver ikke konvertering.
Du kan derfor nøjes med:

Fejl.Text = ex.Message;

Jeg mener at man faktisk kan nøjes med "ex", dvs:

Fejl.Text = ex;


6)
Jeg ville nok have lavet en metode der indeholder database-koden, for ikke at gøre Page_Load-delen uoverskuelig..
Det kunne jo være at du pludseligt skulle tilføje mere kode til Page_Load, hvilket gør det lidt sværer at overskue..
Ingen tager skade af god struktur.. :-)
Avatar billede jimmydk Nybegynder
02. januar 2008 - 21:40 #21
arh men lære da lidt selv om det var en fejl post ;)

Thx
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester