public override async Task OnBeforeAddLineAsync(BeforeAddLineEventArgs e)
{
    IEditEntry editEntryQ = Controls.OfType<IEditEntry>().FirstOrDefault(c => c.Source?.Equals("line|q", StringComparison.InvariantCultureIgnoreCase) ?? false);
    if (!await Dialogs.AnswerYesNo(Page, $"Wilt u echt een lijn toevoegen met het artikel \"{e.EntryArt.TargetSigLabel.Text}\" en Q = {editEntryQ.Text}?"))
    {
        e.CancelAddLine = true;
    }
}

public override async Task OnAfterAddLineAsync(AfterAddLineEventArgs e)
{
    await Dialogs.Stop(Page, $"Lijn nr. {e.Ligne.Table.Rows.Count} werd succesvol toegevoegd! Het bevat het artikel \"{e.Ligne["designatio"]}\".");
}
public override async Task OnBeforeDeleteLineAsync(BeforeDeleteLineEventArgs e)
{
	if (!await Dialogs.AnswerYesNo(Page, $"Wilt u deze lijn {e.Ligne["id_article"]} op deze picking echt verwijderen?"))
	{
		e.CancelDeleteLine = true;
	}
}

public override async void OnAfterDeleteLine(AfterDeleteLineEventArgs e)
{
	await Dialogs.Stop(Page, $"De lijn werd succesvol verwijderd!");
}

public override async Task OnBeforeChangeLineAsync(BeforeChangeLineEventArgs e)
{
	if (!await Dialogs.AnswerYesNo(Page, $"Wilt u de kolom {e.ColumnToChange} van deze lijn {e.Line["id_article"]} echt wijzigen met deze nieuwe waarde {e.NewValue}?"))
	{
		e.CancelChangeLine = true;
	}
}