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();

lundi 28 juillet 2008

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

J'ai eu la chance (travaillé comme une malade lol) ces derniers temps sur Silverlight. Le site www.silverlight.net m'a été d'une grande aide. J'ai pratiquement appris tout ce que je connais aujourd'hui sur le sujet grâce à ce site. Une erreur fréquente lors du déploiement: le contrôle Silverlight ne se charge pas, page aspx vide, bien que le plugin soit bien installé, avec l'erreur suivante: sys.InvalidOperationException: InitializeError #2104
Cette erreur est due au fait que le fichier ".xap" n'est pas enregistré autant que type MIME au niveau de IIS.

Voici comment l'enregistrer:
Sur IIS:


image

Cliquez sur "Propriétés", puis Type MIME, puis Nouveau:

image

Entrez les valeurs suivantes puis validez: 
  - Extension: .xap
  - Type MIME: application/x-silverlight-2-b2
et voilà ! :-)

mercredi 28 mai 2008

Validation de checkbox: cocher au moins une case

Dans mon formulaire, j'ai 2 Checkbox, l'utilisateur doit cocher au moins une sinon les 2.

J'ai placé les 2 cases à cocher et le validateur dans un UserControl. La validation se fait à l'aide d'une fonction javascript.

Voici le UserControl:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CheckBoxControlMatSoir.ascx.cs" Inherits="Controls_DataEntryControls_CheckBoxControlMatSoir" %>

<script language="javascript" type="text/javascript">
function
ValidateTandCs(source, args)
{
var chkMat = document.getElementById('<%= CheckBoxMat.ClientID %>');
var chkAprem = document.getElementById('<%= CheckBoxAprem.ClientID %>');

if ((chkMat.checked) || (chkAprem.checked))
{
args.IsValid = true;
}

if ((chkMat.checked==false) && (chkAprem.checked==false))
{
args.IsValid = false;
}
}
</script>

<
br />
<
asp:CheckBox ID="CheckBoxMat" runat="server" Text="Matinée" ForeColor="Navy" />
&nbsp;&nbsp; &nbsp;
<asp:CustomValidator ID="valTandCs" ClientValidationFunction="ValidateTandCs" runat="server"
ErrorMessage="*" Height="1px"></asp:CustomValidator><br />
<
asp:CheckBox ID="CheckBoxAprem" runat="server" Text="Après-midi" ForeColor="Navy" />





Le code behind:

C#

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;


public partial class Controls_DataEntryControls_CheckBoxControlMatSoir : System.Web.UI.UserControl
{
private bool m_mat_checked = false;
private bool m_aprem_checked = false;


protected void Page_Load(object sender, EventArgs e)
{
m_mat_checked = CheckBoxMat.Checked;
m_aprem_checked = CheckBoxAprem.Checked;
}


public object MatChecked
{
get { return m_mat_checked; }
set
{
if (value.GetType() == DBNull.Value.GetType()) m_mat_checked = false;
else if (value == null) m_mat_checked = false;
else if (value.GetType() == typeof(bool)) m_mat_checked = (bool)value;
else m_mat_checked = false;
}
}

public object ApremChecked
{
get { return m_aprem_checked; }
set
{
if (value.GetType() == DBNull.Value.GetType()) m_aprem_checked = false;
else if (value == null) m_aprem_checked = false;
else if (value.GetType() == typeof(bool)) m_aprem_checked = (bool)value;
else m_aprem_checked = false;
}
}

protected void Page_PreRender()
{
CheckBoxMat.Checked = m_mat_checked;
CheckBoxAprem.Checked = m_aprem_checked;
}

}





Dans la page aspx, il suffit d'insérer le UserControl. Je fais également un Binding grâce aux propriétés MatChecked et ApremChecked du UserControl.

<uc1:CheckBoxControlMatSoir ID="CheckBoxControlMatSoir1" runat="server" 
MatChecked='<%# Bind("matin") %>' ApremChecked='<%# Bind("soir") %>' />

vendredi 23 mai 2008

HTML: Espacement entre les lignes

Utiliser l'élément line-height de la propriété style :

<p style="line-height: 2; text-align: justify">
Le Papa de Toto rentre un jour avec un robot détecteur de mensonge dont la particularité est de gifler le menteur. Ce soir, Toto rentre tard de l'école et son Papa lui demande : Pourquoi rentres-tu tard ? On a dû faire des heures supplémentaires. Subitement, le robot se lève et lui donne une gifle. Non, j'étais allé voir un film. Quel film ? Les dix commandements. Slap, une autre gifle. Excuse-moi Papa, « Les reines du sexe ». Tu n'as pas honte ? A ton âge, je n'avais jamais vu ces genres de films. Slap, Papa reçoit une gifle. Maman qui suivait la scène de la cuisine sort et dit. « Mais André, de quoi te plains-tu ? Il te ressemble bien Toto. Après tout c'est ton fils ! » Et Slap, elle reçoit une gifle.</p>

Le résultat est le suivant:

Le Papa de Toto rentre un jour avec un robot détecteur de mensonge dont la particularité est de gifler le menteur. Ce soir, Toto rentre tard de l'école et son Papa lui demande : Pourquoi rentres-tu tard ? On a dû faire des heures supplémentaires. Subitement, le robot se lève et lui donne une gifle. Non, j'étais allé voir un film. Quel film ? Les dix commandements. Slap, une autre gifle. Excuse-moi Papa, « Les reines du sexe ». Tu n'as pas honte ? A ton âge, je n'avais jamais vu ces genres de films. Slap, Papa reçoit une gifle. Maman qui suivait la scène de la cuisine sort et dit. « Mais André, de quoi te plains-tu ? Il te ressemble bien Toto. Après tout c'est ton fils !» Et Slap, elle reçoit une gifle.

samedi 17 mai 2008

Remplir un DataSet avec les données d'un SqlDataSource

Il est parfois utile de récupérer les données d'un SqlDataSource lié à une source de données afin de les manipuler en code behind, avant de les afficher ou en faire un quelconque usage.

Voici le code:

C#

//remplir un DataView avec les données de SqlDataSource1
DataView dv = (DataView)(SqlDataSource1.Select(DataSourceSelectArguments.Empty));

DataSet ds = new DataSet();

DataTable dt = dv.Table.Clone();

foreach (DataRowView drv in dv)
dt.ImportRow(drv.Row);

ds.Tables.Add(dt);