ContextMenu
Bir nesneye ya da grid satırına sağ tıklandığında açılan menü nesnesidir. Menünün içine eylem düğmeleri (ExecuteActionButton) yerleştirir; bu menüyü başka bir nesneye (örneğin bir DataGrid) bağlarsınız ve kullanıcı bağlı nesneye sağ tıklayınca menü açılır.
Bu nesnenin bir değeri yoktur (VisualControl türevidir). Veri tutmaz; yalnızca bir menü gösterir ve seçilen maddeye göre sunucu olayı tetikler.
Ne zaman kullanılır?
Bir nesneye ya da grid satırına bağlam menüsü ile ek işlemler bağlamak istediğinizde kullanın: "Sil", "Kopyala", "Onaya gönder" gibi. Menü ekranda yer kaplamaz; sadece bağlı nesneye sağ tıklanınca görünür. Sürekli görünür düğmeler gerekiyorsa bunun yerine Button tercih edin.
Bir ContextMenu mutlaka bir ana nesneye (host) bağlanır. Bu bağlama, ContextMenu üzerinde değil, bağlanacak nesnenin üç özelliği ile yapılır: ContextMenuKey, ContextMenuColumnKey, ContextMenuTarget. Aşağıda "Menüyü bir nesneye bağlama" bölümüne bakın.
Tasarımcı özellikleri
Bir ContextMenu seçildiğinde Özellik Görüntüleyici sekmelere ayrılır.
General
| Özellik | Açıklama |
|---|---|
Name | Nesnenin koddaki adı (ör. ContextMenu1). Koddan bu adla erişirsiniz. Ayrıca host nesnenin ContextMenuKey özelliğine bu ad yazılır. |
Caption | Nesnenin başlığı (ControlCaption). |
Title | Menünün başlığı (MultiLanguageText, çok dilli olabilir). |
Data Source
Menü maddelerini elle tek tek tanımlayabileceğiniz gibi, bir veri kaynağından da doldurabilirsiniz.
| Özellik | Açıklama |
|---|---|
Items | Menüde görünecek eylem düğmelerinin listesi (List<ExecuteActionButton>). Her madde bir Name, Text, Icon ve ona bağlı işlemden (Args) oluşur. |
DataSource | Menü maddelerini dolduracak veri kaynağı (DataSource). |
DataSourceType | Veri kaynağının türü (DataSourceType: Dynamic, Static, Relation, Action, Fields). |
Behavior
| Özellik | Açıklama |
|---|---|
ItemsExpr | Menü maddelerini ifadeyle (expression) üretmek için kullanılan alan (String). Maddeleri dinamik oluşturmak istediğinizde işe yarar. |
ParentKey | Üst nesne anahtarı (String). TODO: dökümde mevcut; ContextMenu'yu bir host'a bağlamak için kullanılmaz (bağlama host'un ContextMenuKey özelliğiyle yapılır). Doğrulanmış kullanım idiyomu yok. |
Appearance
| Özellik | Açıklama |
|---|---|
Visible / Client Visible | Nesnenin görünürlüğü (Visible / ClientVisible, Boolean). |
Enabled / Client Enabled | Nesnenin aktif olup olmadığı (Enabled / ClientEnabled, Boolean). Pasifken menü açılmaz. |
Loading | Menünün yükleniyor durumu (Boolean). |
Style / ContainerStyle | Stil ve kapsayıcı stili (Style). |
Custom Class Name | Özel CSS sınıfı (CustomClassName, String). |
DefaultEnabled ve DefaultClientEnabled, tasarım anındaki varsayılan aktiflik değerleridir. Çalışma zamanında genellikle Enabled / ClientEnabled ile çalışırsınız.
Menü maddesi: ExecuteActionButton
Menünün her maddesi bir ExecuteActionButton nesnesidir. Üzerine kod yazarken dallanmayı yaptığınız anahtar Name özelliğidir (madde kimliği). Gerçek üyeleri:
| Üye | Tür | Açıklama |
|---|---|---|
Name | String | Maddenin kimliği. ActionButtonClick olayında args.Name ile bu değere bakarsınız. |
Text | Dictionary<String, String> | Maddede görünen yazı (dil koduna göre çok dilli). |
Title | Dictionary<String, String> | Üzerine gelince çıkan ipucu (çok dilli). |
Icon | String | Maddenin ikonu. |
Visible | Boolean | Maddenin görünürlüğü. Bir maddeyi koddan gizlemek için false yapın. |
TypeName | ExecuteActionType | Maddenin tetiklediği eylemin türü (form aç, süreç başlat, özel eylem vb.). |
Args | BaseExecuteActionArgs | Eyleme ait parametreler. |
Hiyerarşik menü için sibling tip ContextMenuItem kullanılır: Key, Text, Title, Icon ve List<ContextMenuItem> Children. Children listesi alt menü maddelerini tutar. TODO: çalışma zamanı kullanım idiyomu dökümde doğrulanmamıştır; tasarımcıda yapılandırın.
Olaylar
ContextMenu yalnızca iki gerçek olaya sahiptir. Bunlar sunucu tarafında çalışır; her ikisinin de bir sunucu giriş noktası (entry point) vardır.
OnInit / OnLoad / OnPreRender / OnRender, her form nesnesinin temel sınıfı olan BaseControl'den miras alınan çatı (framework) yaşam döngüsü kancalarıdır; dolayısıyla bu nesnede de diğer tüm nesnelerde olduğu gibi mevcutturlar. Bunlar nesnenin kendi tasarımcı olayları değildir; ContextMenu'nun kendi olayları yukarıda listelenen ItemClick ve ActionButtonClick'tir. OnDataLoad ise bu nesnede yoktur, çünkü ContextMenu veriye bağlı (DataBoundControl türevi) bir nesne değildir; OnDataLoad yalnızca veriye bağlı nesnelerde bulunur.
Sunucu olayları (Server)
| Olay | Giriş noktası | Parametre türü | Ne zaman çalışır |
|---|---|---|---|
ItemClick | OnContextMenuItemClick(object sender, ContextMenuItemClickEventArgs e) | ContextMenuItemClickEventArgs | Bağlı nesneden menüde bir madde seçildiğinde. Hangi host'un tetiklediğini e.TargetControlName ile öğrenirsiniz. |
ActionButtonClick | OnActionButtonClick(object sender, ContextMenuActionButtonClickEventArgs e) | ContextMenuActionButtonClickEventArgs | Menüdeki bir eylem düğmesine basıldığında. Hangi maddenin basıldığını e.Name ile öğrenirsiniz. |
ContextMenuItemClickEventArgs:
TargetControlName(String) — menünün bağlı olduğu host nesnenin adı (örn. hangi grid).BaseArgs(Object) — temel argümanlar.TargetArgs(Object) — hedefe özgü argümanlar.ResponseParameters(ResponseParameters).
ContextMenuActionButtonClickEventArgs:
Name(String) — basılan eylem düğmesinin (ExecuteActionButton.Name) kimliği. Dallanmayı bununla yaparsınız.ResponseParameters(ResponseParameters).
ItemClick argümanlarında key adında bir özellik yoktur; madde kimliği ActionButtonClick olayındaki e.Name üzerinden gelir.
Menüyü bir nesneye bağlama (host hookup)
Bir ContextMenu'yu çalıştırmak için onu bir host nesneye bağlamanız gerekir. Bağlama, host nesnenin (DataBoundControl türevi, örn. DataGrid) üç özelliği ile yapılır:
| Host özelliği | Tür | Açıklama |
|---|---|---|
ContextMenuKey | String | Bağlanacak ContextMenu nesnesinin adı (örn. "ContextMenu1"). |
ContextMenuColumnKey | String | (Grid için) menünün bağlanacağı sütunun anahtarı. |
ContextMenuTarget | ContextMenuTarget | Menünün neye bağlanacağı: Container, None, Row, Column. |
ContextMenuTarget değerleri: Container (nesnenin tümü), Row (grid satırı), Column (grid sütunu), None (bağlama yok).
Örnek: bir DataGrid satırına menü bağlama (sunucu, C#)
Aşağıda DataGrid1 satırlarına sağ tıklayınca ContextMenu1 açılacak şekilde bağlama yapılır:
// Menüyü DataGrid satırlarına bağla
DataGrid1.ContextMenuKey = "ContextMenu1";
DataGrid1.ContextMenuTarget = Bimser.CSP.FormControls.Enums.ContextMenuTarget.Row;
ContextMenuKey / ContextMenuTarget özellikleri yalnızca güçlü tipli host nesnede (yukarıdaki Form kodu) ya da tasarımcıda ayarlanır. Akış kodundaki Document1.Controls["DataGrid1"] genel erişimcisi bu özellikleri sunmaz (yalnızca Value / Text / Type / Rows ve GetPropertyValue<T>() taşır); menüyü dinamik bağlamak isterseniz bunu form tarafındaki Controller kodunda yapın.
ContextMenuKey / ContextMenuTarget çoğunlukla tasarımcıda host nesnenin özelliklerinden ayarlanır. Koddan ayarlamak, menüyü duruma göre dinamik bağlamak/çözmek istediğinizde işe yarar (örn. yalnızca belirli bir durumda menüyü etkinleştirmek).
Kod örnekleri: görünürlük ve aktiflik
ContextMenu'nun bir değeri olmadığı için ondan değer okuyup yazmazsınız. Bunun yerine görünürlüğünü/aktifliğini kontrol eder ve olaylarında kod çalıştırırsınız. Sunucu örnekleri turuncu, istemci örnekleri kırmızı çerçevelidir.
Form kodu (C#, sunucu)
// Menüyü pasifleştir (bağlı nesneye sağ tıkta açılmaz)
ContextMenu1.Enabled = false;
// Menüyü tamamen gizle
ContextMenu1.Visible = false;
Akış (Flow) kodu (C#, sunucu)
Document1.Controls["ContextMenu1"].Enabled = false;
Document1.Controls["ContextMenu1"].Visible = false;
İstemci kodu (TypeScript, tarayıcı)
İstemci tarafında nesnelere this. ile erişilir ve özellik adları küçük harfle yazılır:
this.ContextMenu1.enabled = false;
this.ContextMenu1.visible = false;
Örnek 1: hangi düğmeye basıldığını okuma (ActionButtonClick)
ActionButtonClick menüdeki bir eylem düğmesine basıldığında çalışır. Hangi maddenin basıldığını e.Name (madde Name değeri) ile öğrenir, ona göre dallanırsınız.
Sunucu (C#):
void ContextMenu1_OnActionButtonClick(object sender,
Bimser.CSP.FormControls.Events.ContextMenuActionButtonClickEventArgs e)
{
switch (e.Name)
{
case "sil":
ShowMessage("Bilgi", "Kayıt silinecek.",
Bimser.CSP.FormControls.RuleManager.AlertType.Info);
break;
case "kopyala":
ShowMessage("Bilgi", "Kayıt kopyalanacak.",
Bimser.CSP.FormControls.RuleManager.AlertType.Info);
break;
case "onayaGonder":
// TODO: onaya gönderme işini burada yürütün
break;
}
}
İstemci (TypeScript):
async ContextMenu1_OnActionButtonClick(args: any) {
// args.name basılan ExecuteActionButton.Name değerini taşır
if (args.name == "sil") {
this.showMessage("Bilgi", "Kayıt silinecek.", "Info");
} else if (args.name == "kopyala") {
this.showMessage("Bilgi", "Kayıt kopyalanacak.", "Info");
}
}
Örnek 2: hangi nesnenin menüyü tetiklediğini öğrenme (ItemClick)
ItemClick, menü bir madde seçildiğinde çalışır. Buradaki argümanlarda madde anahtarı yoktur; bunun yerine menünün hangi host nesneden açıldığını e.TargetControlName ile öğrenirsiniz. Aynı menüyü birden çok grid'e bağladıysanız, tetikleyen grid'e göre farklı davranabilirsiniz.
Sunucu (C#):
void ContextMenu1_OnContextMenuItemClick(object sender,
Bimser.CSP.FormControls.Events.ContextMenuItemClickEventArgs e)
{
// Menü hangi nesneden açıldı?
if (e.TargetControlName == "DataGridSiparis")
{
ShowMessage("Bilgi", "Sipariş satırı menüsünden seçim yapıldı.",
Bimser.CSP.FormControls.RuleManager.AlertType.Info);
}
else if (e.TargetControlName == "DataGridFatura")
{
ShowMessage("Bilgi", "Fatura satırı menüsünden seçim yapıldı.",
Bimser.CSP.FormControls.RuleManager.AlertType.Info);
}
}
İstemci (TypeScript):
async ContextMenu1_OnContextMenuItemClick(args: any) {
// args.targetControlName menüyü açan host nesnenin adıdır
if (args.targetControlName == "DataGridSiparis") {
this.showMessage("Bilgi", "Sipariş satırından seçim yapıldı.", "Info");
}
}
Örnek 3: bir menü maddesini koşula göre gizleme
Menü maddesini (ExecuteActionButton) Items listesinden adına göre bulup Visible özelliğini kapatabilirsiniz. Örneğin yetkisi olmayan kullanıcıdan "Sil" maddesini gizleyin:
foreach (var madde in ContextMenu1.Items)
{
if (madde.Name == "sil")
{
madde.Visible = false; // "Sil" maddesini bu kullanıcıdan gizle
}
}
Örnek 4: menüyü duruma göre etkinleştirme / pasifleştirme
Belge taslak durumundayken menü açık, onaylandıktan sonra kapalı olsun istiyorsanız menüyü host bağlamasından çözebilir ya da menüyü pasifleştirebilirsiniz:
string durum = Document1.Controls["TextBoxDurum"].Value.ToString();
if (durum == "Onaylandı")
{
// Onaylanmış belgede menüyü kapat
ContextMenu1.Enabled = false;
// İsterseniz host bağlamasını da çözün
DataGrid1.ContextMenuTarget =
Bimser.CSP.FormControls.Enums.ContextMenuTarget.None;
}
else
{
ContextMenu1.Enabled = true;
DataGrid1.ContextMenuKey = "ContextMenu1";
DataGrid1.ContextMenuTarget =
Bimser.CSP.FormControls.Enums.ContextMenuTarget.Row;
}
İpuçları
- ContextMenu tek başına görünmez; mutlaka bir host nesneye
ContextMenuKey+ContextMenuTargetile bağlanmalıdır. Bağlama yoksa sağ tıkta hiçbir şey açılmaz. - Dallanmayı
ItemClick'tee.TargetControlName(hangi nesne) veActionButtonClick'tee.Name(hangi madde) ile yapın.ItemClick'te madde anahtarı yoktur. - Menü maddelerini sabit biliyorsanız
Itemslistesinden tanımlayın; maddeler veriye göre değişiyorsaDataSource/ItemsExprile dinamik doldurun. - Bir maddeyi geçici olarak gizlemek için listedeki ilgili
ExecuteActionButtonnesnesininVisibleözelliğinifalseyapın. - Belirli durumlarda menünün açılmasını istemiyorsanız
Enabledözelliğinifalseyapın ya da host'unContextMenuTargetdeğeriniNoneyapın.
Tüm tasarımcı özellikleri (tam liste)
General: Name, Caption, Title
Data Source: Items (List<ExecuteActionButton>), DataSource, DataSourceType
Behavior: ItemsExpr, ParentKey (TODO: bağlama için kullanılmaz)
Appearance: Visible, ClientVisible, Enabled, ClientEnabled, DefaultEnabled, DefaultClientEnabled, Loading, Style, ContainerStyle, CustomClassName, ControlId
Olaylar (Server): ItemClick (giriş noktası OnContextMenuItemClick), ActionButtonClick (giriş noktası OnActionButtonClick)
Host nesnedeki bağlama özellikleri: ContextMenuKey, ContextMenuColumnKey, ContextMenuTarget (Container / None / Row / Column)
Menü maddesi (ExecuteActionButton): Name, Text, Title, Icon, Visible, TypeName (ExecuteActionType), Args (BaseExecuteActionArgs)
İç içe madde (ContextMenuItem): Key, Text, Title, Icon, Children (List<ContextMenuItem>)