vendredi 26 décembre 2008

ListBox: Sélectionner plusieurs lignes (Items) à partir du code behind

Voici une petite astuce que je viens de rechercher et que je voudrais partager avant de retourner à mes occupations :)

J'ai un contrôle ListBox relié avec une table de la BD. Voici comment sélectionner la 1ere et 2ème ligne du ListBox:

ListBox1.Items[0].Selected = true;
ListBox1.Items[1].Selected = true;


Le résultat dans la page :

image

samedi 29 novembre 2008

Fixing sys.InvalidOperationException: InitializeError #2104 in Silverlight 2 Beta 2

I've been working constantly on Silverlight (at a somewhat crazy pace :)) during the past few months. The site www.silverlight.net helped me a lot. I learned almost everything I know about Silverlight on this site.

I ran into this error quite frequently :
sys.InvalidOperationException: InitializeError #2104
The silverlight control won't load, and page shows blanc, even though the plugin is well installed. In fact, this error is due to the fact that the file with the extension  ".xap"  does not get saved as mime type in IIS.

To save this file correctly, Follow these steps before:
The screens are in french, but the placement of buttons and options is identical


 image

 image 

In the two textboxes, enter the following :
  - Extension : .xap
  - Mime Type : application/x-silverlight-2-b2
That should do it ! :)

Here is the french version of this post.

vendredi 28 novembre 2008

Remplir un DropDownList à partir d'un DataTable

Dans cet exemple, j'interroge la base de données (SQL Server 2005) et je recupere les données dans un DataTable comme suit:

public DataTable getAllClients()
{

DatabaseHelper db = new DatabaseHelper();
DataTable dt = new DataTable();
try
{
dt = db.ExecuteDataSet("spGetAllClients", CommandType.StoredProcedure).Tables[0];
}
catch (Exception ex)
{
}
return (dt);

}



La procédure stockée retourne l'id du client et la raison sociale.



Pour remplir un controle DropDownList, je met les données recupérées depuis la base dans un DataTable dt. Il est possible de relier dt avec le DropDownList, mais j'ai besoin de modifier la présentation des données. Pour celà, j'utilise un 2ème DataTable dtTmp:



DAClient da = new DAClient();

DataTable dt = da.getAllClients();

if (dt.Rows.Count != 0)
{

DataTable dtTmp = new DataTable(); //creation du dattatable dtTmp

dtTmp.Columns.Add("idclient", typeof(Int32)); //datacolumn 0 : "id"
dtTmp.Columns.Add("raisonsociale", typeof(string)); //datacolumn 1: contiendra le texte "id - raisonsociale"

DataRow tmpRow;

tmpRow = dtTmp.NewRow();
tmpRow["idclient"] = "0";
tmpRow["raisonsociale"] = "Sélectionnez un client";
dtTmp.Rows.Add(tmpRow); //ajoute la ligne "0", "Sélectionnez un client" au DataTable

for (int i = 0; i < dt.Rows.Count; i++)
{
tmpRow = dtTmp.NewRow();

tmpRow["idclient"] = dt.Rows[i]["idclient"];

tmpRow["raisonsociale"] = dt.Rows[i]["idclient"] + " - " + dt.Rows[i]["raisonsociale"];


dtTmp.Rows.Add(tmpRow);

}

ddlClients.DataTextField = "raisonsociale";
ddlClients.DataValueField = "idclient";


ddlClients.Items.Clear();

ddlClients.DataSource = dtTmp;

ddlClients.DataBind();
}



Le résultat:



image



En ce moment je travaille sur un projet qui, vu sa nature un peu particulière, les nouvelles techniques et méthodes de développement ne sont pas forcement la bonne solution. J'essaierai autant que je peux de poster du code "the old fashioned way" qui je pense peut toujours être utile pour certains....

vendredi 3 octobre 2008

SQL Server 2005: enregistrer et afficher des images

Dans cet article, je présente un exemple assez simple de l'enregistrement d'une image en utilisant le type de données Image fourni dans SQL Server 2005.

Voici la table que j'utilise:

image

Procédures stockées :

Nom et description Code

spInsertImage : enregistrer une image

create PROCEDURE [dbo].[spInsertImage]
(
@nom varchar(50),
@photo image
)
AS

INSERT INTO images(nom, photo)
VALUES
(@nom, @photo )

select @@IDENTITY

spGetImageByID : récuperer une image avec son ID

create procedure [dbo].[spGetImageByID]
( @id int )
as

select  *
from images
where ID = @id

Interface utilisateur: Enregistrement.

Le contrôle FileUpload permet à l'utilisateur de sélectionner à partir du disque l'image à enregistrer.

<asp:Label ID="lblMessage" runat="server" ForeColor="Red" Width="260px"></asp:Label>
<
br />
<
br />
<
fieldset>
<
legend>Enregistrement Image</legend>
<
br />
Nom :
<asp:TextBox ID="txtNom" runat="server" Width="380px"></asp:TextBox><br />
<
br />
<
asp:FileUpload ID="FileUpload1" runat="server" Width="500px" /><br />
<
br />
<
asp:Button ID="cmdSave" runat="server" Text="Enregistrer image" OnClick="cmdSave_Click"
Height="30px" Width="230px" /><br />
<
br />
</
fieldset>



C#:



protected void cmdSave_Click(object sender, EventArgs e)
{
try
{
if (FileUpload1.PostedFile != null)
{
if (FileUpload1.PostedFile.ContentLength > 0)
{
HttpPostedFile objHttpPostedFile = FileUpload1.PostedFile;

// Vérifier l'extention du fichier. Dans cet exemple, seules les images jpg sont authorisées
string FileExtention = System.IO.Path.GetExtension(FileUpload1.PostedFile.FileName);

if (FileExtention == ".jpg")
{
int intContentlength = objHttpPostedFile.ContentLength;

Byte[] bytImage = new Byte[intContentlength];

objHttpPostedFile.InputStream.Read(bytImage, 0, intContentlength);

//Insertion de l'image ds base de données
DAImage daimage = new DAImage();
InsertedImageID = daimage.InsertImage(txtNom.Text, bytImage);
lblMessage.Text = "Enregistrement effectué.";

ddlNom.Items.Clear();
ddlNom.Items.Add(new ListItem("Sélectionnez une image", "0"));
ddlNom.DataBind();

}
else
{
lblMessage.Text = "Fichiers jpg uniquement.";
}
}
}
}
catch (Exception Exp)
{
lblMessage.Text = "Echec lors de l'enregistrement : <br />" + Exp.ToString();
}
}



Il est necessaire de contrôler l'extention du fichier selectionné par l'utilisateur afin d'eviter l'upload de fichiers exe qui pourraient representer un danger.



L'image est passée à la partie DAL qui s'occupe d'appeler spInsertImage afin d'enregistrer l'image dans la base.



Affichage de l'image:


L'affichage de l'image se fait de la même manière, en appelant spGetImageByID.


Afin d'afficher l'image dans un contrôle Image, il suffit de mettre ce code dans une page ViewImage.aspx et attribuer l'image au contrôle comme suit:




Page où l'on souhaite afficher l'image:



<fieldset>
<
legend>Affichage</legend>Nom image :
<asp:DropDownList ID="ddlNom" runat="server" DataSourceID="SqlDataSourceListeImages"
DataTextField="nom" DataValueField="ID" AppendDataBoundItems="True" Width="230px">
<
asp:ListItem Value="0">S&#233;lectionnez une image</asp:ListItem>
</
asp:DropDownList>
<
asp:Button ID="cmdDisplay" runat="server" Text="Afficher" Height="34px" OnClick="cmdDisplay_Click"
Width="260px" />
<
asp:SqlDataSource ID="SqlDataSourceListeImages" runat="server" ConnectionString="<%$ ConnectionStrings:TestImagesConnectionString %>"
SelectCommand="SELECT [ID], [nom] FROM [Images]"></asp:SqlDataSource>
<
br />
<
br />
<
asp:Image ID="ViewImage" runat="server" />
</
fieldset>


C#:



protected void cmdDisplay_Click(object sender, EventArgs e)
{
string strURL = "~/ViewImage.aspx?idimage=" + ddlNom.SelectedItem.Value ;
ViewImage.ImageUrl = strURL;
}

mercredi 13 août 2008

ASP.NET 2.0: Upload de fichiers

L'upload de fichiers en asp.net 2.0 peut se faire facilement grâce au contrôle FileUpload.

Dans l'exemple suivant, j'effectue un upload d'images vers un emplacement spécifique, qui est le chemin d'une 2ème application.

Création du dossier:

Je commence par créer un dossier dans l'emplacement voulu. ce dossier contiendra mes images.

    <asp:LabelID="lblMessage"runat="server"ForeColor="Red"></asp:Label>
    <
br />
    <
table>
        <
tr> <td>
                <
asp:LabelID="Label3"runat="server"Text="Chemin de l'application :">
                </
asp:Label>
            </
td>
            <
td>
                <
asp:TextBox ID="txtApplicationPath"runat="server"Width="223px"
                  
ValidationGroup="Val1"></asp:TextBox>
                <
asp:RequiredFieldValidator ID="RequiredFieldValidator1"runat="server"
                  
ControlToValidate="txtApplicationPath"
                  
ErrorMessage="Entrez le chemin de l'application"ValidationGroup="Val1">
                </
asp:RequiredFieldValidator>
            </
td>
        </
tr>
        <
tr>
            <
td>
                <
asp:LabelID="Label1"runat="server"Text="Nom du Dossier :"></asp:Label>
            </
td>
            <
td>
                <
asp:TextBox ID="txtFolderName"runat="server"Width="221px"
                  
ValidationGroup="Val1"></asp:TextBox>
                <
asp:RequiredFieldValidator ID="RequiredFieldValidator2"runat="server"
                  
ControlToValidate="txtFolderName"ErrorMessage="Entrez le nom du dossier"ValidationGroup="Val1">
                </
asp:RequiredFieldValidator>
            </
td>
        </
tr>
        <
tr>
            <
td>
              
&nbsp;</td>
            <
td>
                <
asp:ButtonID="cmdCreateFolder"runat="server"onclick="cmdCreateFolder_Click"
                  
Text="Créer le dossier"Width="279px"ValidationGroup="Val1" />
            </
td>
        </
tr>

C#

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//indication du chemin de la 2eme application
txtApplicationPath.Text = "C:\\DEV\\MyBook\\img";
}

}

protected void cmdCreateFolder_Click(object sender, EventArgs e)
{
string path = @txtApplicationPath.Text + "\\" + txtFolderName.Text;

try
{
if (Directory.Exists(path))
{
lblMessage.Text = "Le dosser" + path + " existe déjà. Veuillez choisir un nom different.";
return;
}

// création du dossier
DirectoryInfo di = Directory.CreateDirectory(path);
lblMessage.Text = "Le dossier " + txtFolderName.Text + " a été créé avec succès";
}
catch (Exception ex)
{
lblMessage.Text = "Echec lors de la création du dossier : " + ex.ToString();
}

}


Le dossier saisi dans "Nom du dossier" sera créé dans l'emplacement "Chemin de l'application".

En Form_Load, je précise le chemin de l'application. La meilleure manière de spécifier ce chemin est de l'enregistrer dans une base de données afin de pouvoir eventuellement le mettre à jour si necessaire, sans avoir à revenir au code.



Upload d'images:


Voici une implémentation de l'utilisation du contrôle FileUpload:

<table>
<
tr>
<
td style="width: 146px">
<
asp:Label ID="Label2" runat="server" Text="Images :"></asp:Label>
</
td>
<
td>
<
asp:FileUpload ID="FileUpload1" runat="server" Width="217px" />&nbsp;<asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server"
ControlToValidate="FileUpload1" Display="Dynamic"
ErrorMessage="Selectionnez une image" ValidationGroup="Val2"></asp:RequiredFieldValidator>&nbsp;
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server"
ControlToValidate="FileUpload1" Display="Dynamic"
ErrorMessage="Fichiers jpg, gif ou png uniquement"
ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))+(.jpg|.gif|.png)$"></asp:RegularExpressionValidator>
</td>
</
tr>
<
tr>
<
td style="width: 146px">
&nbsp;</td>
<
td>
<
asp:Button ID="cmdAddPhoto" runat="server" OnClick="cmdAddPhoto_Click" Text="Ajouter"
Width="282px" ValidationGroup="Val2" />
</
td>
</
tr>
</
table>



Le contrôle RegularExpressionValidator est utilisé afin de contrôler le type du fichier selectionné par l'utilisateur. Ici je limite l'upload aux fichiers jpg, gif et png.



C#

protected void cmdAddPhoto_Click(object sender, EventArgs e)
{
try
{
FileUpload1.SaveAs(@txtApplicationPath.Text + "\\" + txtFolderName.Text + "\\" + "changedname.jpg");
lblMessage.Text = "Photo ajoutée";

}
catch (Exception ex)
{
lblMessage.Text = "Echec lors de l'ajout de la photo : " + ex.ToString();
}
}

vendredi 1 août 2008

Passage de QueryString à un contrôle Silverlight

Supposant que j'ai une page Recherche.aspx qui contient un lien "Afficher" qui redirige vers Livre.aspx, laquelle contient un contrôle Silverlight:

query

Le QueryString peut être recupéré dans Page.xaml.cs (si vous utilisez C#) de la manière suivante:

string IDLivre = HtmlPage.Document.QueryString["IDLivre"];

jeudi 31 juillet 2008

Silverlight: passage de paramètres

Une méthode très simple pour passer un paramètre d'une page à une autre est d'utiliser App.Current.Resources comme suit:

App.Current.Resources.Add("BookID", "1");

Celà enregistre la valeur 1 dans BookID.

Pour réutiliser le paramètre:

App.Current.Resources["BookID"].ToString();