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.