Netigma Form Olayları Nasıl Kodlanır?
Giriş
Netigma 3.7+ ile gelen INetigmaFormEventServiceProvider arayüzü sayesinde api kullanıcılarının;
- Bilgi formu yüklenmeden önce, kaydet işlemi gerçekleşmeden önce ve gerçekleştirdikten sonra araya girebilmeleri,
- Girilen form değerlerinin sunucu tarafında özel doğrulama (validasyon) fonksiyonlarından geçirebilmeleri,
- Gerektiğinde form kaydını engelleyebilmeleri,
- Formun altına ve üstüne (yalnızca ilgili forma özel) web kontrolleri ekleyebilmeleri
sağlanmıştır.
Belge İçeriği
INetigmaFormEventServiceProvider arayüzünü gerçekleyen sınıflar Netigma TypeManager içerisine girerler. (bkz: Dikkat Edilmesi Gereken İşlemler.) Yazılan INetigmaFormEventServiceProvider sınıfı arasındaki ikişki netigma meta yönetim sayfalarından sağlanabilir. (Bkz: Form Olay Dinleyicisi özelliği PYS Örnek Olaylar olarak ayarlanmış. Bu isim arayüz gerçekleştirmesindeki DisplayName özelliğinden gelir)
Dikkat Edilmesi Gereken İşlemler
ITask gerçekleştirimi sırasında , "TypeManager(Factory) kullanan sınıflarda dikkat edilmesi gereken kurallar" dokümanı dikkate alınmalıdır.
INetigmaFormEventServiceProvider Üyeleri
public interface INetigmaFormEventServiceProvider:ICloneable, INamedItemReadOnly { void onPreLoadData(FormEventArgs e); void onPreSave(FormEventArgs e); void OnSaveCompleted(FormEventArgs e); WebControl GetHeaderControl(FormEventArgs e); WebControl GetFooterControl(FormEventArgs e); }
onPreLoadData(FormEventArgs e)
Form içerisindeki editör değerleri DataRow dan doldurulmadan önce bu metod çalışır. Editör değerleri değiştirilebilir. Aşağıdaki örnekte metot önceki yıla ait Freight değerleri toplamı 20000 i geçtiği için freight değerini 2 olarak değiştirmiştir.
onPreSave(FormEventArgs e)
Form kaydet butonuna bastıktan sonra, değerler veri tabanına kaydedilmeden önce çalışır. e.Cancel = true; denilmişse form kaydedilmez. e.Message ile gönderilen mesaj metni bilgi formu sayfasında gösterilir. Aşağıdaki örnekte metod içerisinde freight değeri kontrol edilmiş ve kayıt engellenmiştir.
OnSaveCompleted(FormEventArgs e)
Form bilgileri veri tabanına kaydedildikten sonra çalışır. aşağıdaki örnekte metod Test tablosuna formdan girilen freight değerini tarih bilgisi ile kaydetmiştir.
GetHeaderControl(FormEventArgs e)
Formun üstüne forma özel web kontrol ya da kontrollerinin eklenmesin olanak sağlar. Aşağıdaki örnekte metod formun üstüne geçen yıllara ait sipariş toplamlarını not olarak gösteren bir label kontrolünü formun üzerine eklemiştir. İstenirse burada LiteralControl içerisinde script de register edilebilir. Örneğin register edilen script içerisinde freightClientInstance.SetValue(1); gibi bir ifade kullanılırsa freight bilgisinin gösterildiği editörün değeri 1 olarak istemci tarafında ayarlanır. Böylelikle arayüzün bu metodu editör değerlerinin değiştirilmesi ya da ilk değerlerinin verilmesi amacı ile de kullanılabilir. preLoadData dan farklı olarak değişikli istemci tarafında yapılmış olur. Aşağıdaki resimde formun üzerine eklenen etiket görülebilir.
GetFooterControl(FormEventArgs e)
GetHeaderControl gibi kullanılır. Farklı olarak bu metod kontrolü formun altına ekler. Örnekde değer null döndürülmüştür. Bu durumda forma herhangi bir kontrol eklenmez. Yine buradan dönen kontrol içerisinde sayafa script register edilebilir. bu scriptler içerisinde formların istemci işlem desteklerinden faydalanılabilir. categoryname.SetEnabled(false);
FormEventArgs Sınıfı
public class FormEventArgs { public bool Cancel { get; set; } public INetigmaDomain Domain { get; set; } public INetigmaForm Form { get; set; } public string Message { get; set; } public DataRow DataRow { get; set; } public bool PageIsPostBack { get; set; } }
Örnek Uygulama
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using Netcad.Data; using Netcad.Netigma; namespace HelpDocumentExamples.NetigmaFormEventServiceProvider { public class PYSFormEvents : INetigmaFormEventServiceProvider { public string DisplayName { get { return "PYS Örnek Olaylar"; } } public string Name { get { return "INetigmaFormEventServiceProvider.PYSFormEvents"; } } public object Clone() { return new PYSFormEvents(); } public WebControl GetFooterControl(FormEventArgs e) { //Herhangi bir kontrol eklenmeyecekse null değer döndürmelidir. return null; } /// <summary> /// Metoddan dönen kontrol formun üstüne ekleneir. /// </summary> /// <param name="e">Form, Domain, Datarow bilgileri</param> /// <returns>Forma eklenecek kontrol</returns> public WebControl GetHeaderControl(FormEventArgs e) { int year = DateTime.Now.AddYears(-18).Year; string sql = string.Format(@"SELECT SUM(OrderDetails.UnitPrice * OrderDetails.Quantity) AS Total FROM Orders INNER JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID WHERE (DATEPART(year, Orders.OrderDate) = {0})",year); DataTable dt = e.Domain.DefaultDatabase.DataHelper.GetData(sql, null); if (dt != null && dt.Rows.Count >0) { var v = dt.Rows[0][0]; if (v != DBNull.Value) { WebControl hc = new WebControl(System.Web.UI.HtmlTextWriterTag.Div); hc.Controls.Add(new HtmlGenericControl("label") { InnerText = string.Format("Not: {1} yılına ait sipariş toplamı {0} TL. dir", Convert.ToDouble(v).ToString("N"), year) }); return hc; } else return null; } else return null; } /// <summary> /// Editör değerleri datarow dan doldurulmadan önce çalışır. /// </summary> /// <param name="e">Form, Domain, Datarow bilgileri</param> public void onPreLoadData(FormEventArgs e) { int year = DateTime.Now.AddYears(-18).Year; string sql = string.Format(@"SELECT SUM(Freight) AS TotalFreight FROM Orders WHERE (DATEPART(year, Orders.OrderDate) = {0})", year); DataTable dt = e.Domain.DefaultDatabase.DataHelper.GetData(sql, null); if (dt != null && dt.Rows.Count > 0) { var v = dt.Rows[0][0]; if (v != DBNull.Value && Convert.ToDouble(v) > 20000) { e.DataRow["Freight"] = 2; } } } /// <summary> /// Kaydet işlemi gerçekleşmeden önce, datarow değerleri editörden doldurulduktan sonra çalışır. e.cancel = true denmiş ise veritabanına kayıt engellenir. /// </summary> /// <param name="e">Form, Domain, Datarow bilgileri</param> public void onPreSave(FormEventArgs e) { object tmp = e.DataRow["Freight"]; e.Cancel = Convert.ToDouble(tmp) > 15000; e.Message = "Freight değeri 15000 den büyük olamaz"; } public void OnSaveCompleted(FormEventArgs e) { using (INetcadTable tbl = e.Domain.FindTable("Test")) { var freight = e.DataRow["Freight"]; var newRow = tbl.NewRow(); newRow["freight"] = freight; newRow["date"] = DateTime.Now; tbl.Rows.Add(newRow); tbl.Update(); } } } }
Ayrıca Bakınız