Skip to main content

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.

ContextMenu tek başına çalışmaz

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

ÖzellikAçıklama
NameNesnenin koddaki adı (ör. ContextMenu1). Koddan bu adla erişirsiniz. Ayrıca host nesnenin ContextMenuKey özelliğine bu ad yazılır.
CaptionNesnenin başlığı (ControlCaption).
TitleMenü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.

ÖzellikAçıklama
ItemsMenü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.
DataSourceMenü maddelerini dolduracak veri kaynağı (DataSource).
DataSourceTypeVeri kaynağının türü (DataSourceType: Dynamic, Static, Relation, Action, Fields).

Behavior

ÖzellikAçıklama
ItemsExprMenü 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

ÖzellikAçıklama
Visible / Client VisibleNesnenin görünürlüğü (Visible / ClientVisible, Boolean).
Enabled / Client EnabledNesnenin aktif olup olmadığı (Enabled / ClientEnabled, Boolean). Pasifken menü açılmaz.
LoadingMenünün yükleniyor durumu (Boolean).
Style / ContainerStyleStil ve kapsayıcı stili (Style).
Custom Class NameÖzel CSS sınıfı (CustomClassName, String).
Default* özellikleri

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:

ÜyeTürAçıklama
NameStringMaddenin kimliği. ActionButtonClick olayında args.Name ile bu değere bakarsınız.
TextDictionary<String, String>Maddede görünen yazı (dil koduna göre çok dilli).
TitleDictionary<String, String>Üzerine gelince çıkan ipucu (çok dilli).
IconStringMaddenin ikonu.
VisibleBooleanMaddenin görünürlüğü. Bir maddeyi koddan gizlemek için false yapın.
TypeNameExecuteActionTypeMaddenin tetiklediği eylemin türü (form aç, süreç başlat, özel eylem vb.).
ArgsBaseExecuteActionArgsEyleme ait parametreler.
İç içe (alt) menüler

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.

Yaşam döngüsü kancaları ve tasarımcı olayları

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)

OlayGiriş noktasıParametre türüNe zaman çalışır
ItemClickOnContextMenuItemClick(object sender, ContextMenuItemClickEventArgs e)ContextMenuItemClickEventArgsBağlı nesneden menüde bir madde seçildiğinde. Hangi host'un tetiklediğini e.TargetControlName ile öğrenirsiniz.
ActionButtonClickOnActionButtonClick(object sender, ContextMenuActionButtonClickEventArgs e)ContextMenuActionButtonClickEventArgsMenüdeki bir eylem düğmesine basıldığında. Hangi maddenin basıldığını e.Name ile öğrenirsiniz.
Olay parametreleri (gerçek üyeler)

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ğiTürAçıklama
ContextMenuKeyStringBağlanacak ContextMenu nesnesinin adı (örn. "ContextMenu1").
ContextMenuColumnKeyString(Grid için) menünün bağlanacağı sütunun anahtarı.
ContextMenuTargetContextMenuTargetMenü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;
Akış kodunda host bağlama

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.

Bağlama genelde tasarımcıda yapılır

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 + ContextMenuTarget ile bağlanmalıdır. Bağlama yoksa sağ tıkta hiçbir şey açılmaz.
  • Dallanmayı ItemClick'te e.TargetControlName (hangi nesne) ve ActionButtonClick'te e.Name (hangi madde) ile yapın. ItemClick'te madde anahtarı yoktur.
  • Menü maddelerini sabit biliyorsanız Items listesinden tanımlayın; maddeler veriye göre değişiyorsa DataSource / ItemsExpr ile dinamik doldurun.
  • Bir maddeyi geçici olarak gizlemek için listedeki ilgili ExecuteActionButton nesnesinin Visible özelliğini false yapın.
  • Belirli durumlarda menünün açılmasını istemiyorsanız Enabled özelliğini false yapın ya da host'un ContextMenuTarget değerini None yapı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>)