Gridview con una Imagine provenendo dal DB.

mercoledì 22 marzo 2006 - 06.42

aabruzzese Profilo | Junior Member


Scusate il mio Italiano che ormai e da quanto ce non lo scrivo pui.

Ma sto cercando una soluzione a questo problema.

O una pagina .aspx Net2.0 con un Gridview
Il Gridview e databound con un SQLDATASOURCE.

<code>
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:ClubSiteDB %>"
SelectCommand="SELECT aspnet_Users.UserName, aspnet_Users.UserId, Attendance.numofguest, MemberInfo.avatar FROM Attendance INNER JOIN aspnet_Users ON Attendance.member = aspnet_Users.UserId INNER JOIN MemberInfo ON Attendance.member = MemberInfo.memberid WHERE (Attendance.eventid = @id)">
<SelectParameters>
<asp:QueryStringParameter DefaultValue="1" Name="id" QueryStringField="EventId" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
</code>

La Colonna MemberInfo.avatar e di typo IMAGE

Il risultato della Query nel Visual Studio mostra Due Righe con i Dati e L'Imagine.

Ma sulla la pagina propia mi risulta BYTE[]

Il resto e una storia longa ma per le meno spero che mi o fatto capire.

Grazie


Angelo Abruzzese

aabruzzese Profilo | Junior Member


Ciao Marco,

Si questo lo avevo fatto gia, ma cmnq...

<asp:GridView ID="GridView1" runat="server" AllowPaging="True"
DataSourceID="SqlDataSource2" CellPadding="4" ForeColor="#333333" GridLines="None" AutoGenerateColumns="False" DataMember="DefaultView">
<FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
<Columns>
<asp:BoundField DataField="UserName" HeaderText="UserName" SortExpression="UserName" />
<asp:BoundField DataField="numofguest" HeaderText="Number of Guests" SortExpression="numofguest" />
<asp:TemplateField SortExpression="avatar">
<ItemTemplate>
<asp:Image ID="Image1" runat="server" ImageUrl='<%# "Default222.aspx?ID=" + Eval("UserName") %>'/>
</ItemTemplate>

</asp:TemplateField>
</Columns>
<RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
<SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" />
<PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
<HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="White" />

</asp:GridView>

Questo il il Gridview,

Poi o una pagina Default222.aspx che scrive la riposta per l'Imagine.

<%@ Page Language="VB" MasterPageFile="~/Default.master" Title="Untitled Page" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Web" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Web.SessionState" %>
<%@ Import Namespace="System.Web.UI" %>
<%@ Import Namespace="System.Web.UI.WebControls" %>
<%@ Import Namespace="System.Web.UI.HtmlControls" %>
<%@ Import Namespace="System.Data.OleDB"%>

<script runat=server>

Private intNumof As Integer
Public strName As String
Public UserName As String


Public Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)

UserName = Request.QueryString("ID")


Try
UserName = Request.QueryString("ID")
' Create Instance of Connection and Command Object
Dim myConnection As New SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("ClubSiteDB").ConnectionString)
Dim myCommand As New SqlCommand("SELECT Attendance.Member,Memberinfo.Avatar FROM Attendance,Memberinfo where Attendance.member = MemberInfo.memberid and Attendance.UserName = @AName", myConnection)

myCommand.Parameters.Add(New SqlParameter("@AName", DbType.String))
myCommand.Parameters("@AName").Value = UserName

myConnection.Open()
Dim myDataReader As SqlDataReader
myDataReader = myCommand.ExecuteScalar()


Do While (myDataReader.Read())
' System.IO.MemoryStream memoryStream = new System.IO.MemoryStream( byteArray );
' System.Drawing.Image image = System.Drawing.Image.FromStream( memoryStream );
'System.Drawing.Image thumbnail = new Bitmap( newWidth, newHeight );
'System.Drawing.Graphics graphic = System.Drawing.Graphics.FromImage( myDataReader.Item("avatar") );

Dim byteArray As Byte() = CType(myDataReader("avatar"), Byte())
Dim mstream As New System.IO.MemoryStream(byteArray, 0, byteArray.Length)
Dim dbImage As System.Drawing.Image = System.Drawing.Image.FromStream(New System.IO.MemoryStream(byteArray))
Dim thumbnailImage As System.Drawing.Image = dbImage.GetThumbnailImage(100, 100, Nothing, New System.IntPtr())
thumbnailImage.Save(mstream, dbImage.RawFormat)
Dim thumbnailByteArray(mstream.Length) As [Byte]
mstream.Position = 0
mstream.Read(thumbnailByteArray, 0, Convert.ToInt32(mstream.Length))
Response.BinaryWrite(thumbnailByteArray)

Loop
myConnection.Close()

Catch SQLexc As SqlException

Response.Write("Read Failed : " & SQLexc.ToString())

End Try

End Sub


</script>


<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<body style="font: 10pt verdana">
<asp:Image runat="server" ID="avatarimage" CssClass="photo" />
</body>
</asp:Content>


Ma con questa pagine si trove qualche errore, non riesco a fare prendere un SQLPARAMETER.

Ma a la fine, nel VisualStudio quando si crea il SQLDATASOURCE, .. TEST QUERY mi risulta la photo.


726x491 54Kb





Angelo Abruzzese

aabruzzese Profilo | Junior Member


Questa e l'errore che risulta.


Server Error in '/WebSite1' Application.
--------------------------------------------------------------------------------

Unable to cast object of type 'System.Guid' to type 'System.Data.SqlClient.SqlDataReader'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidCastException: Unable to cast object of type 'System.Guid' to type 'System.Data.SqlClient.SqlDataReader'.

Source Error:

Line 45: myConnection.Open()
Line 46: Dim myDataReader As SqlDataReader
Line 47: myDataReader = myCommand.ExecuteScalar()
Line 48:
Line 49:

Source File: C:\aspnet\WebSite1\Default222.aspx Line: 47

Stack Trace:

[InvalidCastException: Unable to cast object of type 'System.Guid' to type 'System.Data.SqlClient.SqlDataReader'.]
ASP.default222_aspx.Page_Load(Object sender, EventArgs e) in C:\aspnet\WebSite1\Default222.aspx:47
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +13
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +45
System.Web.UI.Control.OnLoad(EventArgs e) +80
System.Web.UI.Control.LoadRecursive() +49
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3745




Credo d'avero ce andro di nuovo sul Websphere JSP's con MYSQL e finisce il balo con ASP.NET


Angelo Abruzzese

Luigi3 Profilo | Junior Member

Sfrutto questo thread per una domanda simile che riguarda il mio problema:
ho un gridview e vorrei aggiungere una colonna con un'immagine che cambia in base al contenuto di una specifica colonna. Dovrei creare una colonna template ma poi non so come fare il controllo sul valore del campo e dove mettere le istruzioni.
Le istruzioni sono semplicissime: se il valore è 0 metto un'immagine, se il valore è 1 ne metto un'altra.
Vorrei inoltre fare un controllo simile anche su altri campi (ad esempio di tipo booleano con valori true o false) per far apparire le stesse immagini.
Come posso fare?

Grazie a tutti.

Luigi3 Profilo | Junior Member

Ho provato il codice che tu mi hai dato modificandolo leggermente per il mio caso, infatti nel database anziche' avere un booleano ho in intero e quindi ho scritto cosi':

<script language="javascript" type="text/javascript">
protected string GetPath(int flag)
{
if(flag == 1)
{
return "~/1.jpg";
}
else
{
return "~/0.jpg";
}
}
</script>

messo nel tag javascript

poi nell'aspx ho messo:

<ItemTemplate>
<asp:Image ImageUrl='<%# (string)Eval("ENABLE") %>' runat="server"/>
</ItemTemplate>

Ma nella colonna non mi appare niente, cosa ho sbagliato?

Forse ho capito: ho questa dichiarazione:
<asp:TemplateField HeaderText="ENABLE" ItemStyle-VerticalAlign="Top">
ma che praticamente non ha nome. Tu dicevi di mettere in Eval() il nome della colonna. Come si imposta un ID ad un template?

Grazie ancora

Luigi3 Profilo | Junior Member

Quindi devo metterlo nel .cs?
Ho provato a mettercelo ma non visualizzo niente lo stesso. Potresti darmi altre informazioni?

aabruzzese Profilo | Junior Member


Luigi,

L'imagine e nel DB o sul hard drive?

A la fine o cambiato il M.O. e adesso tutte le imagine si trovano sul Hard Drive, cosi la vita e pui facile.

Si Microsoft non vuole pui sopportare le imagine direttamente dal DB sul Gridview a me non mi
da tanta fadiga.




Angelo Abruzzese

Luigi3 Profilo | Junior Member

Nel file .cs ho inserito questa parte di codice:
protected string GetPath(int enable)
{
if (enable == 1)
{
return "1.jpg";
}
else
{
return "0.jpg";
}
}

come colonna nel gridview ho messo questo codice:
<asp:TemplateField HeaderText="ENABLE2" ItemStyle-VerticalAlign="Top">
<ItemTemplate>
<asp:Image ID="Image1" ImageUrl='<%# (string)Eval("ENABLE") %>' runat="server"/>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="Stato" Runat="server" >
<asp:ListItem Value="1" Text="Enable"/>
<asp:ListItem Value="0" Text="Disable"/>
</asp:DropDownList>
</EditItemTemplate>
</asp:TemplateField>

La colonna ENABLE2 non viene riempita.

Luigi3 Profilo | Junior Member

Mettendo un breakpoint sulla funzione GetPath ho notato che questa funzione non viene richiamata durante il riempimento del gridview. Come devo richiamarla?


246x229 21Kb

La figura illustra il mio problema:
la colonna ENABLE è il contenuto originale della colonna sul database
la seconda colonna ENABLE mette un'immagine che si chiama 0.jpg o 1.jpg a seconda del contenuto della colonna
la terza dovrebbe essere quella di cui stiamo discutendo. Vorrei che fosse simile alla seconda, ma vorrei poter chiamare le immagini inidpendentemente dal contenuto della colonna stessa.

Luigi3 Profilo | Junior Member

Perfetto adesso funziona alla grande!! grazie 1000!!
Ho dovuto solo convertire il tipo di dato che la funzione legge dal database, in quanto era di tipo object.
Grazie mille. Adesso ho un problemino con l'edit tamplate. credi che posso postarlo qui?

Luigi3 Profilo | Junior Member

Purtroppo non posso accettare la risposta xche' non sono stato io ad aprire questo thread, mi dispiace...

Per il problema dell'edit avevo aperto gia' un altro thread: http://www.dotnethell.it/forum/messages.aspx?ThreadID=7322
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