Detailsview campo null

mercoledì 04 ottobre 2006 - 18.35

contiello Profilo | Senior Member

Salve ragazzi ho il seguente problema.
In una pagina ho una gridview ed un detailsview
i due controlli sono legati e quando seleziono un record nella gridview, la correlata detailsview si popola dei campi del record selezionato ... e fin qui tutto ok

io genero i fields della detailsview a runtime in particolare ho alcuni boundfields ed un field di tipo HyperLinkField
e su questo ho alcuni problemi.

il codice che uso per generare il field è il seguente ( DESCRIZIONE_URL e URL sono campi di una tabella)

Dim xlink As New HyperLinkField
xlink.Text = "Link"
xlink.DataTextField = "DESCRIZIONE_URL"
Dim dataNavigateUrlFields() As String = {"URL"}
xlink.DataNavigateUrlFields = dataNavigateUrlFields
Me.DetailsView1.Fields.Add(xlink)

dopo avere eseguito questo codice mi appare il field correttamente.

Io vorrei però che quando il campo "DESCRIZIONE_URL" o il campo "URL" sono vuoti ("" oppure null) non compaia l'HyperLinkField!

riprendendo il codice sopra prima dell'ultima istruzione Me.DetailsView1.Fields.Add(xlink)
ci vorrebbe un if del tipo

if xlink.text <> "" and xlink.text not isnull then
Me.DetailsView1.Fields.Add(xlink)
else

xlink.dispose
end if


Spero di essere stato chiaro grazie

alx_81 Profilo | Guru

Ciao!
non credo di aver capito benissimo la tua richiesta..

Tu vuoi che quando il campo del db che ti torna il valore da bindare all'hyperlinkfield è vuoto non si veda nessun hyperlink e quindi che l'area non sia clickabile?

Oppure non vuoi proprio aggiungerlo sulla griglia?

Alx81 =)

http://blogs.dotnethell.it/suxstellino

contiello Profilo | Senior Member

non voglio aggiungerlo alla griglia
all'occorrenza se i campi sono valorizzati voglio visualizzare il field
altrimenti non visualizzarlo proprio

0v3rCl0ck Profilo | Guru

Ciao,

potresti impostare la proprietà Visible utilizzando una funzione protected a cui gli passi il valore del campo (Visible='<%# CheckVisible(DataBinder.Eval(Container.DataItem, "DBColName")) %>'), nella funzione ritorni false se è vuoto o dbnull, altrimenti true e di conseguenza nascondi o rendi visibile il controllo. Altrimenti gli setti la stessa proprietà all'interno del metodo associato all'evento ondatabound del detailsview, ma penso ke il metodo più comodo sia usare la funzione protected a meno ke tu nn abbia già implementato l'evento ondatabound e quindi ti conviene aggiungere una riga di codice li.


enjoy it

contiello Profilo | Senior Member

ho capito la soluzione che mi proponi ma non mi è del tutto chiaro l'uso dei seguenti oggetti

potresti per cortesia creare solo la definizione della funzione con i parametri ?

grazie

0v3rCl0ck Profilo | Guru

Un altro metodo che mi sono dimenticato di descriverti è quello di fare un inline if direttamente sulla proprietà e quindi senza dover scrivere code behind e dovrebbe rispecchiare una cosa così:

Visible = '<%# IIf(Databinder.Eval(Container.DataItem, "NomeCol") IS DBNull.Value,False,IIf(Databinder.Eval(Container.DataItem, "NomeCol") = "",False,True)) %>'

altrimenti definisci la seguente funzione:

Protected Function CheckVisible(ByVal valToCheck As Object) As Boolean If valToCheck IS DBNull.Value OrElse DirectCast(valToCheck,String) = "" Then Return False Else Return True End Function

e poi metti la proprietà Visible = '<%# CheckVisible(Databinder.Eval(Container.DataItem, "NomeCol")) %>'


enjoy it

contiello Profilo | Senior Member

io vorrei poter gestire tutto nel code behind,anche perchè il field del dataview è creato a runtime quindi non ho altre soluzioni
.

alx_81 Profilo | Guru

Allora sei costretto a trappare l'evento databound del tuo detailsview..
e a quel punto, gestire l'item aggiungendo la valorizzazione della proprietà Visible dell'hyperlinkfield..
come già detto da 0v3rCl0ck.
Mi sembrava una buona soluzione alternativa..
Ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

contiello Profilo | Senior Member

ragazzi sono all'esaurimento nervoso anche perchè penso che sia una cavolata ma non riesco

vi ho allegato l'intero piccolo progetto.

se lo lanciate vi rendete subito conto che il record con id_tabella = 2 non ha valori nel campo url

io non vorrei far comparire nel detailsview la riga relativa al link quando questo non è valorizzato

vi ringrazio della pazienza e della disponibilità

alx_81 Profilo | Guru

Ciao.
Ti ho scritto al volo una soluzione che però è legata alla struttura del tuo gridview:

Dim Gvr As GridViewRow = DirectCast(sender, GridView).SelectedRow If Gvr.Cells(5).Text <> "&nbsp;" Then 'If Dt.Rows(0).Item("DESCRIZIONE_URL") <> String.Empty Then 'inizio codice creazione field dinamico Dim xlink As New HyperLinkField xlink.Text = "Link" xlink.HeaderText = "Link" xlink.DataTextField = "DESCRIZIONE_URL" Dim dataNavigateUrlFields1() As String = {"URL"} xlink.DataNavigateUrlFields = dataNavigateUrlFields1 Me.DetailsView1.Fields.Add(xlink) End If

spero ti basti.
ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

contiello Profilo | Senior Member

Grazie della risposta ma ho già provato questa soluzione il problema è che nel gridview non esiste questa colonna.
Pertanto dovrei prendere il valore da un'altra parte.

Sai dirmi dove posso ...


per adesso faccio una select con il campo chiave e prelevo il valore ma è una soluzione di certo non elegante ne performante

ciao e grazie

alx_81 Profilo | Guru

>Grazie della risposta ma ho già provato questa soluzione il problema
>è che nel gridview non esiste questa colonna.
>Pertanto dovrei prendere il valore da un'altra parte.
>
>Sai dirmi dove posso ...
>
>
>per adesso faccio una select con il campo chiave e prelevo il
>valore ma è una soluzione di certo non elegante ne performante

ok.. prova questo
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

In poche parole, con l'evento databound, mi sposto a controllare il source e non il gridview (ce può avere la struttura che vuole).
Chiaro è che il datasource deve avere la colonna descrizione_url.
Se il campo è null, nascondo la riga del detailsview.

>
>ciao e grazie
Di nulla.

facci sapere!



Alx81 =)

http://blogs.dotnethell.it/suxstellino

contiello Profilo | Senior Member

Grazie funziona ...

ho però alcuni dubbi su alcune funzionalità magari se le spieghi a me potranno servire ad altri.

Non mi è ben chiara la funzione DirectCast.

e poi nell'istruzione DetView.Rows(1).Visible = False , invece di specificare un indice non è possibile specificare il nome del campo.?

Ad ogni modo grazie mille

0v3rCl0ck Profilo | Guru

>Grazie funziona ...
>
>ho però alcuni dubbi su alcune funzionalità magari se le spieghi
>a me potranno servire ad altri.
>
>Non mi è ben chiara la funzione DirectCast.

DirectCast converte l'oggetto nel tipo definito nel secondo argomento solo se il tipo ivi espresso espone la stessa interfaccia o eredita dalla stessa superclasse... in poche parole se i due tipi sono "compatibili"...

>
>e poi nell'istruzione DetView.Rows(1).Visible = False , invece
>di specificare un indice non è possibile specificare il nome
>del campo.?

no, non è possibile

>
>Ad ogni modo grazie mille



enjoy it
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5