vendredi 26 décembre 2008

Redirection: Ouvrir une page dans une nouvelle fenêtre

Un des moyens de rediriger l'utilisateur vers une 2ème page en ouvrant celle ci dans une nouvelle fenêtre consiste à utiliser JavaScript comme suit:

string url = "http://msdn.microsoft.com";
Response.Write("<script>window.open('" + url + "');</script>");

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

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

Envoi de mail avec IIS - méthode 2

Dans le post http://s4n44.blogspot.com/2008/04/envoi-de-mail-avec-aspnet-webform.html, je présente comment envoyer un mail avec le serveur virtuel SMTP (de IIS) configuré et du code behind.

Ici je décris une autre méthode où on utilise le noeud <mailSettings> dans web.config.

Le code est le suivant:

<configuration>

<
system.net>
<
mailSettings>
<
smtp deliveryMethod="Network">
<
network userName=emetteur@mondomaine.com password="MonMotdePasse" host="smtp.mondomaine.com"/>
</
smtp>
</
mailSettings>
</
system.net>
.....
</configuration>

L'authetification se produit à ce niveau. userName est l'adresse mail que j'utilise pour envoyer le mail, dans password je met mon mot de passe, et host est le nom du serveur SMTP correspondant au domaine de mon adresse mail. Voici le code d'envoi de mail:

C#

public void SendMail()
{
MailMessage mail = new MailMessage(emetteur@mondomaine.com, "to@domaine.com");
mail.Subject = "mail test 2";
mail.Body = "ceci est le corps du message.";
SmtpClient smtp = new SmtpClient();
smtp.Send(mail);
}

L'instruction smtp.Send(mail) utilise le code placé dans web.config.

Redirection vers une nouvelle fenêtre, en code behind

La solution classique de la redirection vers une nouvelle fenêtre est d'utiliser un contrôle tel que HyperLink, spécifier le nom de la page cible dans la propriété NavigateUrl et mettre Target="_blank", comme ceci:

<asp:HyperLink ID="hypLettre" runat="server" NavigateUrl="Lettre.aspx" Target="_blank">Afficher la lettre</asp:HyperLink>

Dans le cas où nous voudrions avoir le même résultat mais avec un autre contrôle (qui ne supporterait pas Target="_blank"> ) ou dans d'autres conditions, il est possible de passer par le code behind:


C#

string URL = "Lettre.aspx?idprospect=" + hdnIdProspect.Value;
Response.Write("<script>window.open('" + URL + "');</script>");


J'ai utilisé la variable URL pour me simplifier la vie car j'ai besoin de passer un QueryString dans l'appele de ma page cible.

samedi 5 avril 2008

Envoi de mail avec ASP.NET 2.0 - WebForm

L'envoi de mail peut se faire avec IIS en local, à condition que le composant Serveur SMTP soit installé (voir panneau de configuration - ajout/supp de programmes - ajout/suppression de composants Windows, ensuite "IIS" puis vérifier que "service SMTP" est cochée).

J'ai créé ici une fonction SendMail qui fait le travail.

Je précise qu'il faut ajouter :

using System.Net.Mail;

(Avant l'envoi de mail se fesait en utilisant avec System.Web.Mail, qui est à present obsolète).

public void SendMail()
{
//Déclaration du MailMessage
MailMessage mail = new MailMessage();
//Affectation des adresses mail
//emetteur(email, nom)
mail.From = new MailAddress("from@domain.com", "Sanaa");
//destinataire
mail.To.Add("to@domain.com");
//objet du mail
mail.Subject = "mail test";
//corps du mail
mail.Body = "ceci est le corps du message.";
//envoi du message
SmtpClient smtp = new SmtpClient("localhost");
smtp.Send(mail);
}

Si tout se passe bien, le mail est envoyé sans problème!

Erreurs possibles et solutions:


En ce qui me concerne, ça ne pas marché du 1er coup.. j'ai eu l'erreur suivante:

 5.7.1 Unable to relay for to@domain.com


j'ai utilisé une adresse mail valide pourtant. la solution est la suivante:


  1. ouvrir IIS


  2. click droit sur "serveur virtuel SMTP par defaut" - propriétés


  3. dans l'onglet "Accès", cliquez sur le boutton "relais" (relay)


  4. assurez vous que 127.0.0.1 est ajouté et autorisé (granted). Si ce n'est pas le cas ajoutez le. Votre fenêtre devrait ressembler à ceci:



image




Mise à jour - 18 mai 2008:


Les paramètres d'envoi (adresse du serveur SMTP, nom d'utilisateur et mot de passe) peuvent être spécifiés dans le code de ma manière suivante:

public void SendMail()
{
//Déclaration du MailMessage
MailMessage mail = new MailMessage();
//Affectation des adresses mail
//emetteur(email, nom)
mail.From = new MailAddress("emetteur@domaine.com", "nom emetteur");
//destinataire
mail.To.Add("destinataire@domaine.com");
//objet du mail
mail.Subject = "mail test";
//corps du mail
mail.Body = "ceci est le corps du message.";
//envoi du message
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.domaine.com";
smtp.Credentials = new NetworkCredential("emetteur@domaine.com", "motdepasse");
smtp.Send(mail);
}

Vos commentaires sont les bienvenus.

jeudi 7 février 2008

ASP.NET 2.0 - DropDownList de Rôles en C#

Ce post est une traduction de http://oudinia.blogspot.com/2008/02/grid-filter-and-text-changed.html, article rédigé par mon estimé collègue Oussama Dinia.

Ceci est un user control qui encapsule un DropDownList, un ObjectDataSource et une class Roles personnalisée et simplifiée. Le user contrôle se connecte à la base de données aspnetdb spécifiée dans le fichier web.config.
Pour les programmeurs VB.NET, voici un convertisseur sympa fournit par Telerik (www.telerik.com) :
http://www.codechanger.com/

Voici le code du user contrôle:

<%@control language="C#"autoeventwireup="true"codefile=" ddlRoles.ascx.cs"inherits="RoleControl"%>
<asp:dropdownlist id="DropDownList1" runat="server" datasourceid="sourceRoles" datatextfield
="RoleName"
   
datavaluefield="RoleName" width
="185px">
    </
asp:dropdownlist
>
<
asp:objectdatasourceid="sourceRoles"runat="server"selectmethod="GetRoles"typename="CustomRoles"> </asp:objectdatasource>

Le code behind du user contrôle:

using System; 

public partial class RoleControl: System.Web.UI.
UserControl  

    public StringSelectedValue  
    { 
        get {return this.DropDownList1.SelectedValue; } 
        set {this.DropDownList1.SelectedValue =value; } 
    } 
}
 
L'objet DataSource utilise la classe suivante:
 
using System;
using System.Web.Security;
using System.Collections.Generic;

public class
CustomRoles
{
    private string mRoleName;

    public string RoleName
    {
        get {return mRoleName; }
        set { mRoleName =value; }
    }

   
/// <summary>
    ///
Cette fonction parcourt tous les rôles de la base de données,
   
///
construit une collection de CustomRoles dans une liste générique de CustomRoles,
   
///
puis la liste est retournée pour etre utilisée comme source de données du contrôle DropDownList.
   
/// </summary>

   
publicList<CustomRoles> GetRoles()
    {
       
//getroles
       
string[] roleslist = Roles.GetAllRoles();
        int i = 0;

       
//instance de customroles
       
CustomRolesbr;

       
//creation de la liste (ou collection d'instances de CustomRoles)
       
List<CustomRoles> lstbr =new List<CustomRoles>();

       
//remplissage de la liste en parcourant le tableau de strings
       
foreach(string brolein roleslist)
        {
            br = new CustomRoles();
            br.RoleName = brole;
            lstbr.Add(br);
        }
        return lstbr;
    }
Vos commentaires sont les bienvenus.

J'espère que ce post vous sera utile. ça marche à merveille :)

dimanche 27 janvier 2008

Data Binding et Data Access - Vue d'ensemble

En développant, nous utilisons un contrôle pour représenter un champ.
Plusieurs contrôles >> plusieurs champs.


Bind et eval :

http://msdn2.microsoft.com/fr-fr/library/ms178366%28VS.80%29.aspx

La fonction Eval sert à définir une liaison unidirectionnelle (en lecture seule) => One way binding.
La fonction Bind sert à une liaison bidirectionnelle (actualisable) => Two way binding.
Formulaire : FormView => Bind « Nom du champ»

Exemple :

<%# Bind("Nom") %>
<%# Eval("Nom") %>

"Nom" n’est autre que le nom d’un champ dans ma base de données.
Grid :

- Gridview :
Bind(«Nom_du_champ »)
Eval(«Nom_du_champ»)

List:

- DataTextField

- DataValueField

DataGrid:

- Evénement ItemDataBound: s’exécute à chaque fois qu’un item (ligne) d’un DataGrid est lié (databind).

- Evénement ItemCommand: Se produit lorsque l'utilisateur sélectionne une commande associée à un élément du DataGrid.


Rapatrier des données: DataSet ou DataReader ?

Exemple de fontion qui retourne l’age d’une personne et qui l’affiche dans un label lblAge:
Fonction GetAge() as integer 
This.lblAge.Text = GetAge();


Utilisation de DataSet :

* Manipulation avancée lors de la consultation

* Reporting

* Transfert de données entre systèmes

* Windows Forms



Utilisation de DataReader :

* Web ReadOnly, structure légère, non transferable, performant

* Remplir des objets métier

* Parcourir des données avec un accès rapide (for loop)



DataSet/DataReader :

DataSet fait appel a un datareader, remplit les objets, ferme le datareader et ainsi la connexion.



DataSet/DataReader et les contrôles :

- Le contrôle SQLDataSource a 2 modes: DataSet et DataReader.

- XmlDataSource (FormView avec XmlDataSource, XPath("Book/Title") )

- DataSet et XML (ReadXml, WriteXml)

- ObjectDataSource (Classes et des collections de classes) (Formview, GridView, dropdownlist)

samedi 5 janvier 2008

Intro

Je crée ce blog afin de partager des concepts et des techniques en programmation ASP.NET. J'ai eu la chance de rencontrer dans mon (premier/récent) travail des personnes compétentes qui ont l'esprit ouvert et le sens du partage, d'où l'idée de créer ce blog. Je réalise à présent que c'est le début d'une expérience intéressante, avec à la clé quelque chose dont j'ai toujours cru: travailler dur et persévérer par passion, et non parce que c'est ce que l'on doit faire ou ce que l'on attend de nous.

"Je m'intéresse au futur parce que c'est là que je passerai le reste de ma vie"
Charles F.Kettering

To be continued...