Ülke => Şehir, Kurs => Sınıf Adı => Konu gibi çok seviyeli basamaklı editörlere ihtiyacınız olabilir.
Serenity 1.8.2 ile başlamak oldukça basittir. Arama düzenleyicileri bu entegre işlevselliğe sahiptir.
1.8.2'den önceki sürümler için de bu mümkündü ve Serene'de bazı örnekler vardı, ancak çalışması için bazı editör sınıfları tanımlamanız gerekiyordu.
Diyelim ki Ülke, Şehir, İlçe olmak üzere üç tablodan oluşan bir veritabanımız var:
- Ülke Tablosu : CountryId, CountryName
- Şehir Tablosu : CityId, CityName, CountryId
- Bölge Tablosu : DistrictId, DistrictName, CityId
Öncelikle Sergen'i kullanarak her üç tablo için de kod oluşturduğunuzdan ve [LookupScript]hepsinde bir özelliğinizin olduğundan emin olun:
[LookupScript("MyModule.Country")]
public sealed class CountryRow : Row...
{
[DisplayName("Country Id"), Identity]
public Int32? CountryId
{
get { return Fields.CountryId[this]; }
set { Fields.CountryId[this] = value; }
}
[DisplayName("Country Name"), Size(50), NotNull, QuickSearch]
public String CountryName
{
get { return Fields.CountryName[this]; }
set { Fields.CountryName[this] = value; }
}
}
[LookupScript("MyModule.City")]
public sealed class CityRow : Row...
{
[DisplayName("City Id"), Identity]
public Int32? CityId
{
get { return Fields.CityId[this]; }
set { Fields.CityId[this] = value; }
}
[DisplayName("City Name"), Size(50), NotNull, QuickSearch]
public String CityName
{
get { return Fields.CityName[this]; }
set { Fields.CityName[this] = value; }
}
[DisplayName("Country"), ForeignKey("Country", "CountryId"), LookupInclude]
public Int32? CountryId
{
get { return Fields.CountryId[this]; }
set { Fields.CountryId[this] = value; }
}
}
[LookupScript("MyModule.District")]
public sealed class DistrictRow : Row...
{
[DisplayName("District Id"), Identity]
public Int32? DistrictId
{
get { return Fields.DistrictId[this]; }
set { Fields.DistrictId[this] = value; }
}
[DisplayName("District Name"), Size(50), NotNull, QuickSearch]
public String DistrictName
{
get { return Fields.DistrictName[this]; }
set { Fields.DistrictName[this] = value; }
}
[DisplayName("City"), ForeignKey("City", "CityId"), LookupInclude]
public Int32? CityId
{
get { return Fields.CityId[this]; }
set { Fields.CityId[this] = value; }
}
}
LookupIncludeDistrictRow'un CityId alanına ve CityRow'un CountryId alanına nitelik eklediğinizden emin olun . Bunların istemci tarafında bulunmasına ihtiyacımız var, aksi halde varsayılan olarak arama komut dosyalarına dahil edilmezler.
Bu alanları, örneğin CustomerForm gibi bir formda basamaklı arama düzenleyicileri olarak düzenlemek istiyorsanız, bunları şu şekilde ayarlarsınız:
[FormScript("MyModule.Customer")]
[BasedOnRow(typeof(Entities.CustomerRow))]
public class CustomerForm
{
public String CustomerID { get; set; }
public String CustomeraName { get; set; }
[LookupEditor(typeof(Entities.CountryRow))]
public Int32? CountryId { get; set; }
[LookupEditor(typeof(Entities.CityRow),
CascadeFrom = "CountryId", CascadeField = "CountryId")]
public Int32? CityId { get; set; }
[LookupEditor(typeof(Entities.DistrictRow),
CascadeFrom = "CityId", CascadeField = "CityId")]
public Int32? DistrictId { get; set; }
}
Bu özellikleri CustomerRow'da da ayarlayabilirsiniz.
Burada CascadeFrom özelliği şehir editörüne, bağlanacağı ana editörün kimliğini (cascade) bildirir.
Bu form oluşturulduğunda CountryId alanı CountryId ID'li bir editör ile işlenecek , dolayısıyla CityId arama editörünün CascadeFrom özelliğini bu ID'ye ayarladık .
CascadeField şehirlerin filtreleneceği alanı belirler. Böylece, ülke düzenleyici değeri değiştiğinde, şehir düzenleyici öğeleri CountryId özelliklerine göre şu şekilde filtrelenecektir :
this.Items.Where(x => x.CountryId == CountryEditorValue)
CascadeFrom ve CascadeField öznitelikleri aynıysa , yalnızca CascadeFrom belirtmeniz gerekir , ancak burada açık olmak istedim.
Bu basamaklı düzenleyicileri müşteri kılavuzunun filtre çubuğuna eklemek istiyorsanız, CustomerGrid.cs'nin CreateToolbarExtensions yönteminde şunu yapın:
AddEqualityFilter<LookupEditor>("CountryId",
options: new LookupEditorOptions
{
LookupKey = "MyModule.Country"
});
AddEqualityFilter<LookupEditor>("CityId",
options: new LookupEditorOptions
{
LookupKey = "MyModule.City",
CascadeFrom = "CountryId",
CascadeField = "CountryId"
});
AddEqualityFilter<LookupEditor>("DistrictId",
options: new LookupEditorOptions
{
LookupKey = "MyModule.District",
CascadeFrom = "CityId",
CascadeField = "CityId"
});
Burada, CustomerRow'da CountryId, CityId ve DistrictId alanlarınızın olduğunu varsayalım.
Artık hem düzenleme hem de filtreleme için kullanışlı basamaklı düzenleyicileriniz var.