webForumDet fria alternativet

Fråga: Hyperlink i datagrid

.NETur .NET

23 svar · 760 visningar · startad av gunnargren

Medlem sedan apr. 200625 inlägg
Frågan#1

Hej!
Har en datagrid där jag vill skapa en knapp och när man klickar på den ska ett pdf dokument komma fram. Hade tänkt spara pdf filen i en mapp och spara sökvägen i databasen. Direkta sökvägen är C:\Inetpub\wwwroot\Test\pdf\festprogram.pdf och den fungerar om jag testar den i en browser. Så här ser koden ut

<asp:Hyperlinkcolumn target="_blank" dataNavigateUrlfield="urTDS" datatextfield="urTDS" Headertext=" TDS "></asp:HyperLinkColumn>

och jag får upp rätt i sökväg i datagriden men och det blir en länk men det händer inget när jag klickar. Hoppas ni förstår vad jag menar, är lite trött och kan nog var lite otydlig...

Tack på förhand!
/Jonas

Medlem sedan jan. 20022 440 inlägg
#2

jag avskyr när pdf filer öppnas i broswern, jag ser mycket hellre att du stream:ar den till adobe istället.

Såhär har jag löst det du är ute efter fast med hjälpfiler.

Public Sub HelpDisplay(ByVal myFile As String)
	Dim myDir As String = Server.MapPath("~/help/")
	Dim oFileStream As FileStream
	Dim lFileSize As Long, lStartpos = 0
	' Read the file
	Try
		oFileStream = New FileStream(myDir & myFile, FileMode.Open)
	Catch ex As FileNotFoundException
		HttpContext.Current.Response.Clear()
		CreateMessageAlert(Me, "Could not find the specific file.", "key1")
		HttpContext.Current.Response.End()
		Return
	Catch Ex As Exception
		HttpContext.Current.Response.Clear()
		CreateMessageAlert(Me, "An error occured: " & Ex.Message, "key1")
		HttpContext.Current.Response.End()
		Return
	End Try
	' Get the size of the file
	lFileSize = oFileStream.Length

	Dim bBuffer(CInt(lFileSize)) As Byte
	oFileStream.Read(bBuffer, 0, CType(lFileSize, Integer))
	oFileStream.Close()

	' Attach The stream to the browser.
	With HttpContext.Current
		.Response.ClearContent()
		.Response.ContentType = "application/pdf"
		.Response.AddHeader("content-disposition", "attachment; filename=" & myFile & "")
		.Response.BinaryWrite(bBuffer)
		.Response.End()
	End With
End Sub
Medlem sedan apr. 200625 inlägg
#3

Tack, är på jobbet nu. Men ska kollla på det när jag kommer hem, verkar vara en mycket bättre lösning den du har...

mvh Jonas

Medlem sedan apr. 200625 inlägg
#4

Får det inte riktigt att fungera, är osäker på hur jag ska ta in det till datagriden. Har gjort det så här nu men det fungerar inte...

<asp:TemplateColumn HeaderText=" TDS ">		
        <ItemTemplate>					
              <asp:HyperLink Runat =server NavigateUrl ='<%#HelpDisplay(DataBinder.Eval(Container.DataItem, "urTDS"))%>' ImageUrl=images\pdf.gif ID="Hyperlink1">
	 <%#DataBinder.Eval(Container.DataItem, "urTDS")%>
              </asp:HyperLink>			
         </ItemTemplate>
</asp:TemplateColumn>
Medlem sedan dec. 19996 721 inlägg
#5

Funktionen HelpDisplay streamar ut innehållet, så den kan du inte lägga in i NavigateUrl. Där ska det vara en URL (Gäller för övrigt även ursprungsfelet. Det ska vara en URL, inte den absoluta filsökvägen).

Skapa en ny aspx som tar något ID (inte filnamnet) för filen som argument i querystring och anropa HelpDisplay i den, eller skapa en knapp i din grid som anropar funktionen.

Medlem sedan dec. 19996 721 inlägg
#6

CatZ skrev:

jag avskyr när pdf filer öppnas i broswern

Det är därför denna är så ljuvlig.

https://addons.mozilla.org/firefox/636/

Medlem sedan apr. 200625 inlägg
#7

Går dåligt det här, får det inte att fungera. Förstår inte koden riktigt...Visar först hur jag har gjort sen vad det är jag inte förstår

<asp:TemplateColumn HeaderText=" TDS ">
<ItemStyle Width="150px" VerticalAlign="top"></ItemStyle>
	<ItemTemplate>
                <a href="pdf.aspx?HelpDisplay=<%#Databinder.Eval (Container.DataItem, "urID")%>" class="forum"><%#Databinder.Eval (Container.DataItem, "urTDS")%></a>
             </ItemTemplate>
</asp:TemplateColumn>

Har skapat en pdf.aspx där jag anropar HelpDisplay (enl. Catz kod), men det fungerar inte.
Sen får jag felmed. på CreateMessageAlert vet inte vad den gör..Sen är jag osäker på om det blir rätt sökväg till mappen där jag har pdf-filerna, dom ligger i wwwroot/namn/pdf. Blir det rätt då att skriva (enl. kod ovan) Server.MapPath("~/namn/pdf/")?

Om någon skulle hjälpa mig skulle jag vara tacksam och gärna föklara koden hur den fungerar.

Tack för hjälpen hittills! (y)

Medlem sedan dec. 19996 721 inlägg
#8

Sökvägen stämmer nog. Vad händer när du klickar på länken? Hur ser pdf.aspx ut?

I ASP.NET 2.0 kan

<%#Databinder.Eval (Container.DataItem, "urID")%>

ersättas med

<%#Eval ("urID")%>
Medlem sedan apr. 200625 inlägg
#9

kör i 1.0

och det händer ingenting...

Eller rättare sagt pdf.aspx öppnas men det är bara en tom sida

CreateMessageAlert vad gör den?

Medlem sedan dec. 19996 721 inlägg
#10

Nu ser jag att CreateMessageAlert ligger i CatZ kod. Börja lite smått med att kommentera ut de raderna.

Medlem sedan apr. 200625 inlägg
#11

har gjort det...

Medlem sedan dec. 19996 721 inlägg
#12

Och nu händer ingenting?

Byt för stunden ut CreateMessageAlert mot ett par Response.Write som skriver ut felmeddelandet (och sökvägen).

Medlem sedan apr. 200625 inlägg
#13

det händer ingenting...

Testade först att lägga en response.write längst ner för att se om sökvägen stämde. Men då syndes ingenting, gjorde om det nu och la det så här:

Public Sub HelpDisplay(ByVal myFile As String)
        Dim myDir As String = Server.MapPath("~/Autofox2/pdf/")
        Dim oFileStream As FileStream
        Dim lFileSize As Long, lStartpos = 0
        [B]Response.Write(myDir)[/B]

Men det syns ingenting på sidan....

Medlem sedan dec. 19996 721 inlägg
#14

Gjorde du som jag skrev?

"Byt för stunden ut CreateMessageAlert mot ett par Response.Write som skriver ut felmeddelandet (och sökvägen)."

Längst ner och överst är inte riktigt samma sak.

Visa gärna hela sidans kod.

Medlem sedan apr. 200625 inlägg
#15

Så här ser det nu:

Public Sub HelpDisplay(ByVal myFile As String)
        Dim myDir As String = Server.MapPath("~/Autofox2/pdf/")
        Dim oFileStream As FileStream
        Dim lFileSize As Long, lStartpos = 0

        ' Read the file
        Try
            oFileStream = New FileStream(myDir & myFile, FileMode.Open)
        Catch ex As FileNotFoundException
            HttpContext.Current.Response.Clear()
            Response.Write(myDir)
            'CreateMessageAlert(Me, "Could not find the specific file.", "key1")
            HttpContext.Current.Response.End()
            Return
        Catch Ex As Exception
            HttpContext.Current.Response.Clear()
            Response.Write(myDir)
            ' CreateMessageAlert(Me, "An error occured: " & Ex.Message, "key1")
            HttpContext.Current.Response.End()
            Return
        End Try

        ' Get the size of the file
        lFileSize = oFileStream.Length

        Dim bBuffer(CInt(lFileSize)) As Byte
        oFileStream.Read(bBuffer, 0, CType(lFileSize, Integer))
        oFileStream.Close()

        ' Attach The stream to the browser.
        With HttpContext.Current
            .Response.ClearContent()
            .Response.ContentType = "application/pdf"
            .Response.AddHeader("content-disposition", "attachment; filename=" & myFile & "")
            .Response.BinaryWrite(bBuffer)
            .Response.End()

        End With

    End Sub
Medlem sedan dec. 19996 721 inlägg
#16

Hela sidan, tack.

Medlem sedan jan. 20022 440 inlägg
#17

Usch nu mår jag dåligt, inte likt mig att posta något och inte följa upp. Måste glömt lägga in den i bevakning ursäkta så mycket men nu ska jag försöka hjälpa till lite.

Låt asp.net sköta det hela åt dig.

<asp:TemplateColumn>
	<ItemTemplate>
		<asp:LinkButton 
			ID="pdfLink"
			runat="server" 
			CommandArgument='<%#Databinder.Eval (Container.DataItem, "urID")%>'
			CommandName="HelpDisplay" 
			Text='<%#Databinder.Eval (Container.DataItem, "urTDS")%>'>
		</asp:LinkButton>
	</ItemTemplate>
</asp:TemplateColumn>

Och i kod bakom:

Public Sub HelpDisplay(ByVal sender As Object, ByVal e As CommandEventArgs)
	Dim myDir As String = Server.MapPath("~/Autofox2/pdf/")
	Dim oFileStream As FileStream
	Dim lFileSize As Long, lStartpos = 0
	Dim myFile As String = e.CommandArgument

	' Read the file
	Try
		oFileStream = New FileStream(myDir & myFile, FileMode.Open)
	Catch ex As FileNotFoundException
		HttpContext.Current.Response.Clear()
		Response.Write(myDir)
		'CreateMessageAlert(Me, "Could not find the specific file.", "key1")
		HttpContext.Current.Response.End()
		Return
	Catch Ex As Exception
		HttpContext.Current.Response.Clear()
		Response.Write(myDir)
		' CreateMessageAlert(Me, "An error occured: " & Ex.Message, "key1")
		HttpContext.Current.Response.End()
		Return
	End Try

	' Get the size of the file
	lFileSize = oFileStream.Length

	Dim bBuffer(CInt(lFileSize)) As Byte
	oFileStream.Read(bBuffer, 0, CType(lFileSize, Integer))
	oFileStream.Close()

	' Attach The stream to the browser.
	With HttpContext.Current
		.Response.ClearContent()
		.Response.ContentType = "application/pdf"
		.Response.AddHeader("content-disposition", "attachment; filename=" & myFile & "")
		.Response.BinaryWrite(bBuffer)
		.Response.End()

	End With

End Sub

Det är helt otestat men du kan i alla fall använda dig av commanname och commandargument, detta förutsätter iofs att du anger filnamnet som argument och inte något id.

Medlem sedan apr. 200625 inlägg
#18

Du behöver absolut inte be om ursäkt det är jag som ska tacka, ska titta på det sen. Operade halsmandlarna igår och är lite sliten, skriver tillbaka så fort jag har testat....

Medlem sedan apr. 200625 inlägg
#19

Det fungerar tyvärr inte...

Medlem sedan dec. 19996 721 inlägg
#20

När det inte fungerar måste du berätta mer.

137 ms totalt · 3 externa anrop · v20260731065814-full.55e59744
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)