65 messaggi dal 20 aprile 2004
Ciao a tutti,

innanzitutto mi presento: sono Kranz e mi sono appena iscritto a questo forum. Sono abbastanza ignorante per quel che riguarda Asp.net: penso quindi che presto mi odierete.

Eccovi la mia domanda (ho provato a cercare su google e sui newsgroups ma non sono stato fortunato):

in una pagina aspx ho una datagrid che viene popolata da un database Oracle. FIn qui nulla di trascendentale. Il mio problema è che le colonne si allargano automaticamente a seconda del dato più lungo visualizzato. Io vorrei invece che le colonne avessero sempre la larghezza che ho stabilito io in designtime.
Ho provato ad impostare la larghezza delle colonne andando nel generatore di proprietà/formato/colonne/ecc... ma la grid non sembra aver gradito più di tanto.

Suggerimenti? Critiche?

Grazie a tutti, spero di non aver fatto una domanda già postata da altri.
Kranz.
<asp:TemplateColumn HeaderText="Validità" SortExpression="ReleaseDate" ItemStyle-Width="110px" ItemStyle-VerticalAlign="Top">

questo dovrebbe bastare :)


poi se un testo troppo lungo finesce su più righe e non è cosa gradita :)

http://www.aspitalia.com/liste/usag/script.aspx?ID=591

xiaaooz
Modificato da nostromo il 20 aprile 2004 18.30 -

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
65 messaggi dal 20 aprile 2004
Grazie nostromo!!

Propongo una promozione sul campo ad ammiraglio!

Entrambi i tuoi consigli sono stati utili allo scopo. Però per impedire il multiline ho agito nell'evento ItemDataBound della datagrid, troncando qui le stringhe.

Denghiu!
Kranz.
10 messaggi dal 13 luglio 2004
nostromo ha scritto:
<asp:TemplateColumn HeaderText="Validità" SortExpression="ReleaseDate" ItemStyle-Width="110px" ItemStyle-VerticalAlign="Top">


Ciao,
e se invece volessi risolvere le cose lato CodeBehind?

Sara
(Sara.Vallenari@areaweb.it)
8 messaggi dal 15 luglio 2004
ciao, come hai fatto a troncare le stringhe del datagrid lette dal db?
se sono vuote?
10 messaggi dal 13 luglio 2004
Ciao a tutti,
ho una datagrid con colonne costruite a runtime (non template) e voglio che mantengano la dimensione fissa che imposto loro al momento della creazione.
La prima colonna è associata ad un campo del DataSet, si tratta di un campo di tipo String costituente un codice alfanumerico. Ho impostato la larghezza di questa colonna (HeaderStyle.Width e ItemStyle.Width) a 100 px.

Il problema è che se nel dataset c'è anche solo un codice alfanumerico avente una lunghezza tale da richiedere più di 100 pixel, la colonna della mia griglia viene ridimensionata automaticamente al fine di visualizzare tutta la stringa.

Questo, per il layout della mia pagina è un vero disastro, perchè se mi cambia la dimensione della colonna, devo poter ridimensionare anche altre cose presenti sulla pagina.

Allora per risolvere il problema devo trovare il modo di:

1) Fare si che la mia colonna rimanga larga 100pixel a priscindere da cosa conterrà (non c'è un modo per far si che se la stringa da visualizzare in una cella supera la dimensione della colonna venga troncata oppure - e forse è meglio - venga mandata a capo?)

OPPURE
2) poter sapere, lato CodeBehind, la nuova dimensione della colonna che si è adattata al testo che contiene. Non c'è un metodo per determinare, data una stringa e un'oggetto di tipo FontStyle, la dimensione in pixel che quella stringa occupa sullo schermo? In tal caso potrei mantenere io il controllo sul ridimensionamento.


Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi

Non c'è un metodo per determinare, data una stringa e un'oggetto di tipo FontStyle, la dimensione in pixel che quella stringa occupa sullo schermo?

si si, è il metodo .MeasureString() di System.Drawing.Graphics.

Troncare una stringa nel metodo tradizionale, cioè contandone i caratteri, non è un metodo tanto efficace perchè i caratteri hanno larghezza variabile. Una stringa composta da 30 "i" ha una lunghezza differrente di una che contiene 30 "W".

Per questo usare .MeasureString() è di certo di preciso, anche se leggermente più dispendioso in termini di prestazioni (ma solo pochino) :)

io ho questa funzione:
Dim bitm As New System.Drawing.Bitmap(1,1)
Dim g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(bitm)
Function chop$(stringa$, larg%)
return chop(stringa, larg, false)
End Function
Function chop$(stringa$, larg%, isBold As Boolean)
Dim finale$ = stringa
if larg > 0 then
Dim miofont As System.Drawing.Font
if isBold then
miofont = new System.Drawing.Font("Verdana",11,System.Drawing.FontStyle.Bold,System.Drawing.GraphicsUnit.pixel)
else
miofont = new System.Drawing.Font("Verdana",11,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.pixel)
end if
Dim chopped As Boolean = false
while g.MeasureString(finale, miofont).width > larg
finale = Left(finale, Len(finale)-1)
chopped = true
end while
if chopped then
while g.MeasureString(finale, miofont).width > larg-15
finale = Left(finale, Len(finale)-1)
end while
finale &= "..."
end if
end if
if isBold then return "<b>" & finale & "</b>" else return finale
End Function


e la uso così:

Response.write("testo", 50)
oppure
Response.write("testo", 50, true)
se il testo in questione è in grassetto.

50 rappresenta la lunghezza massima in pixel della stringa. Se è più lunga, la tronca a un po' meno di 50 e gli aggiunge tre puntini ...

Puoi modificarla a tuo piacimento.
Non passo alcun dato alla funzione riguardante il font perchè nei miei siti di solito uso Verdana a 11px e l'ho messo come costante all'interno della funzione stessa.
ciao
Modificato da BrightSoul il 03 agosto 2004 15.55 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.