Cette page montre un exemple de customizer pour l'écran de modification d'une fiche de signalétique dans MercatorPenguin. Il s'applique au signalétique des clients. Le code source est fourni dans le zip disponible ci-dessous.
Ce customizer ajoute un bouton (HistoButton) dont le code est inclus dans le projet. Il hérite donc de Microsoft.Maui.Controls.Button. Il permet d'afficher une page d'historique (HistoPage). Le code de cette page HistoPage.xaml est aussi dans le projet. Ce bouton est placé via un override de la méthode OnInit.
Dans le code de HistoButton, on montre comment utiliser la méthode GetRunSqlData pour exécuter une requête SQL au travers de MercatorPenguinServer.
var r = await BaseEditCustomizer.GetRunSqlData<HistoDescriptor>("select top 20 type,id,journal,cast(piece as bigint) as piece,date,tot_ttc_dv as tot from PIEDS_V where id_cli=@c_id order by date desc", [new MercatorPenguin.RunSqlDescriptor.Parameter("@c_id", idSig)]);
Dans le code de HistoPage.xaml.cs, on voit comment utiliser la méthode DoInMercatorInstance qui se met en place de façon identique à celle qui prévaut pour les CustomPages.
DoInMercatorInstanceRequest doInMercatorInstanceRequest = new DoInMercatorInstanceRequest
{
Type = histoDescriptor.Type,
Id = histoDescriptor.Id,
Journal = histoDescriptor.Journal,
Piece = histoDescriptor.Piece
};
MercatorPenguin.DoInMercatorInstanceDescriptor doInMercatorInstanceDescriptor = new MercatorPenguin.DoInMercatorInstanceDescriptor
{
Assembly = "<Other\\TestPenguinCustom\\Server\\TestPenguinCustomServer.dll",
ClassName = "TestPenguinCustomServer.TestClass",
MethodName = "DoubleQuantities",
Parameter = Api.JsonConvertSerializeObject(doInMercatorInstanceRequest)
};
activityIndicator.SetActive(true);
var r = await MercatorPenguin.BaseCustomPage.DoInMercatorInstance(doInMercatorInstanceDescriptor);
activityIndicator.SetActive(false);
if (r.Error != null)
{
_ = MercatorPenguin.Dialogs.Stop(this, r.Error);
}
else
{
DoInMercatorInstanceResponse doInMercatorInstanceResponse = Api.JsonConvertDeserializeObject<DoInMercatorInstanceResponse>(r.Result);
if (doInMercatorInstanceResponse.Error != null)
_ = MercatorPenguin.Dialogs.Stop(this, doInMercatorInstanceResponse.Error);
else
_ = MercatorPenguin.Dialogs.Stop(this, doInMercatorInstanceResponse.Result);
}
Le customizer montre comment effectuer une validation avant la sauvegarde via OnBeforeSave.
public override async Task OnBeforeSaveAsync(BeforeSaveEventArgs e)
{
IEditEntry editEntryNom = Controls.OfType<IEditEntry>().FirstOrDefault(x => x.Source == "c_nom");
if (editEntryNom == null)
{
await Dialogs.Stop(Page, "L'entry associé à C_NOM est introuvable !");
e.CancelSave = true;
return;
}
IEditEntry editEntryRemise = Controls.OfType<IEditEntry>().FirstOrDefault(x => x.Source == "c_remise");
if (editEntryRemise == null)
{
await Dialogs.Stop(Page, "L'entry associé à C_REMISE est introuvable !");
e.CancelSave = true;
return;
}
decimal? remise = await Dialogs.AskDecimal(Page, "Confirmez la remise pour ce client ?", 0, editEntryRemise.DecimalValue);
if (remise == null)
{
e.CancelSave = true;
return;
}
editEntryRemise.DecimalValue = remise.Value;
if (!await Dialogs.AnswerYesNo(Page, $"Voulez-vous vraiment enregistrer les modifications sur le client \"{editEntryNom.Text}\" ?"))
{
e.CancelSave = true;
}
}
Il montre aussi comment afficher un message après la sauvegarde.
public override async Task OnAfterSaveAsync(AfterSaveEventArgs e)
{
await Dialogs.Stop(Page, "Le fiche client a été enregistrée avec succès !");
} A télécharger :
0000003449.zip (4 Kb - 13/05/2026)