تعد عناصر التحكم في مصدر البيانات نوعًا جديدًا من عناصر تحكم الخادم المقدمة في Microsoft Visual Studio 2005. وهي جزء أساسي من بنية ربط البيانات ويمكنها توفير نموذج برمجة تعريفي وسلوك ربط البيانات التلقائي من خلال عناصر تحكم ربط البيانات. ستقدم هذه المقالة والمقالات اللاحقة في هذه السلسلة العناصر الأساسية لتنفيذ عناصر التحكم في مصدر البيانات.
مقدمة
باختصار، يلخص عنصر تحكم مصدر البيانات مخزن البيانات وبعض العمليات التي يمكن تنفيذها على البيانات المضمنة. يرتبط عنصر التحكم DataBound بعنصر تحكم مصدر البيانات من خلال خاصية DataSourceID الخاصة به. تكون معظم مخازن البيانات التقليدية إما جدولية أو هرمية، ويتم تقسيم عناصر التحكم في مصدر البيانات وفقًا لذلك. ما نريد تقديمه هنا هو التحكم في مصدر البيانات بتنسيق جدولي.
لا يقوم عنصر التحكم بمصدر البيانات بحد ذاته بالكثير؛ حيث يتم تغليف كل المنطق في فئات مشتقة من DataSourceView. يجب أن يقوم DataSourceView واحد على الأقل بتنفيذ وظيفة استرداد (أي تحديد) مجموعة من الصفوف. يمكن أن يوفر وظيفة تعديل البيانات (أي إدراج وتحديث وحذف) (اختياري). يمكن لعناصر التحكم المرتبطة بالبيانات التحقق من مجموعات الميزات الممكّنة من خلال خصائص Can؟؟؟ يعد عنصر التحكم بمصدر البيانات نفسه مجرد حاوية لطرق عرض واحدة أو أكثر ذات أسماء فريدة. وفقًا للاتفاقية، يمكن الوصول إلى العرض الافتراضي من خلال اسمه، أو يمكن أن يكون فارغًا. ما إذا كان يمكن تحديد ما إذا كانت العلاقة موجودة بين طرق العرض المختلفة أم لا، أو ما هو نوع العلاقة الموجودة بين طرق العرض المختلفة، بشكل مناسب استنادًا إلى تنفيذ كل عنصر تحكم في مصدر البيانات. على سبيل المثال، قد يوفر عنصر تحكم مصدر البيانات طرق عرض مختلفة تمت تصفيتها لنفس البيانات من خلال طرق عرض مختلفة، أو قد يوفر مجموعة من الأسطر الفرعية في طريقة عرض ثانوية. يمكنك استخدام الخاصية DataMember لعنصر التحكم المرتبط بالبيانات لتحديد طريقة عرض معينة (إذا كان عنصر تحكم مصدر البيانات يوفر طرق عرض متعددة). يرجى ملاحظة أن أيًا من عناصر التحكم في مصدر البيانات المضمنة في Whidbey لا تقدم حاليًا طرق عرض متعددة.
وأخيرا، اسمحوا لي أن أقدم بعض المحتوى. تقوم عناصر التحكم في مصدر البيانات (وطرق عرضها) بتنفيذ مجموعتين من واجهات برمجة التطبيقات. المجموعة الأولى من واجهات برمجة التطبيقات هي واجهة مجردة محددة لأربع عمليات بيانات شائعة يمكن استخدامها بطريقة عادية من أي عنصر تحكم مرتبط بالبيانات. المجموعة الثانية اختيارية، ويتم تعريفها من حيث المجال أو مخزن البيانات الذي تمثله، وعادة ما تكون مكتوبة بقوة، وهي مخصصة لمطوري التطبيقات.
مثال
في هذه المقالات، سوف تقوم بتنفيذ WeatherDataSource الذي سيعمل مع REST (الإنجليزية) XML API التي يوفرها موقع Weather.com (الإنجليزية) لاسترداد معلومات الطقس بناءً على الرمز البريدي. عادةً ما يتم تنفيذ عناصر التحكم في مصدر البيانات المشتقة أولاً.
الطبقة العامة WeatherDataSource: DataSourceControl {
سلسلة عامة ثابتة للقراءة فقط
CurrentConditionsViewName = "CurrentConditions";
WeatherDataSourceView
_currentConditionsView;
يحصل {
إذا (_currentConditionsView == فارغة) {
_currentConditionsView = new WeatherDataSourceView(this, CurrentConditionsViewName);
}
إرجاع _currentConditionsView;
}
}
سلسلة عامة الرمز البريدي {
يحصل {
string s = (string)ViewState["ZipCode"];
العودة (ق ! = فارغة) s : String.Empty؛
}
تعيين {
إذا (String.Compare (القيمة، الرمز البريدي،
StringComparison.Ordinal) != 0) {
ViewState["ZipCode"] = value;
CurrentConditionsView.RaiseChangedEvent();
}
}
}
تجاوز محمي DataSourceView GetView(string viewName) {
إذا (String.IsNullOrEmpty(viewName) ||
(String.Compare(viewName, CurrentConditionsViewName,
StringComparison.OrdinalIgnoreCase) == 0)) {
إرجاع CurrentConditionsView؛
}
رمي ArgumentOutOfRangeException("viewName");
}
تجاوز محمي ICollection GetViewNames() {
إرجاع سلسلة جديدة[] { CurrentConditionsViewName };
}
الطقس العام GetWeather() {
إرجاع CurrentConditionView.GetWeather();
}
}
كما ترى، الفكرة الأساسية هي تنفيذ GetView لإرجاع مثيل عرض مسمى، وGetViewNames لإرجاع مجموعة طرق العرض المتوفرة.
اختر هنا اشتقاق من DataSourceControl. الشيء الوحيد الذي ليس من السهل ملاحظته هو أن عنصر التحكم المرتبط بالبيانات يبحث بالفعل عن واجهة IDataSource، ويقوم عنصر التحكم DataSource بتنفيذ الواجهة من خلال تطبيق GetView وGetViewNames. السبب وراء الحاجة إلى الواجهة هو تمكين التحكم في مصدر البيانات ليكون جدوليًا وهرميًا (إن أمكن، وفي هذه الحالة يتم استخلاصه من النموذج الرئيسي وتنفيذ نموذج آخر كواجهة). ثانيًا، يسمح أيضًا بتحويل عناصر التحكم الأخرى في سيناريوهات مختلفة لمضاعفة سعة مصدر البيانات. لاحظ أيضًا خاصية ZipCode العامة وأسلوب GetWeather الذي يقوم بإرجاع كائن طقس مكتوب بقوة. واجهة برمجة التطبيقات هذه مناسبة لمطوري الصفحات. لا يحتاج مطورو الصفحات إلى التفكير في DataSourceControl وDataSourceView.
الخطوة التالية هي تنفيذ عرض مصدر البيانات نفسه. يوفر هذا المثال تحديدًا وظيفة مستوى التحديد فقط (وهو الحد الأدنى من المتطلبات والوظيفة الوحيدة المفيدة في هذا السيناريو).
فئة مختومة خاصة WeatherDataSourceView : DataSourceView {
Private WeatherDataSource _owner
public WeatherDataSourceView(WeatherDataSourceowner, string viewName)
: القاعدة (المالك، اسم العرض) {
_owner = مالك؛
}
تجاوز محمي IEnumerable ExecuteSelect(
وسيطات DataSourceSelectArguments) {
الوسائط.RaiseUnsupportedCapabilitiesError(this);
WeatherObject = GetWeather();
إرجاع الطقس الجديد[] { WeatherObject };
}
GetWeather للطقس الداخلي () {
سلسلة الرمز البريدي = _owner.ZipCode;
إذا (zipCode.Length == 0) {
رمي InvalidOperationException () الجديد ؛
}
WeatherService WeatherService = new WeatherService(zipCode);
إرجاع WeatherService.GetWeather();
}
الفراغ الداخلي RaiseChangedEvent() {
OnDataSourceViewChanged(EventArgs.Empty);
}
}
بشكل افتراضي، تقوم فئة DataSourceView بإرجاع خطأ من خصائص مثل CanUpdate وطرح NotSupportedException من التحديث والأساليب ذات الصلة. الشيء الوحيد الذي عليك القيام به هنا في WeatherDataSourceView هو تجاوز طريقة ExecuteSelect المجردة وإرجاع IEnumerable الذي يحتوي على بيانات الطقس "المحددة". في التنفيذ، يتم استخدام فئة WeatherService المساعدة، والتي تستخدم ببساطة كائن WebRequest للاستعلام عن Weather.com (باللغة الإنجليزية) باستخدام الرمز البريدي المحدد (لا يوجد شيء مميز حول ذلك).
ربما لاحظت أنه تم وضع علامة ExecuteSelect على أنها محمية. ما يستدعيه عنصر التحكم المرتبط بالبيانات فعليًا هو أسلوب التحديد العام (والمختوم) الذي تم تمريره في رد الاتصال. تنفيذ Select يستدعي ExecuteSelect ويستدعي رد الاتصال بمثيل IEnumerable الناتج. هذا النمط غريب جداً وهناك سبب لذلك، سيتم شرحه في مقالات لاحقة من هذه السلسلة. الرجاء الانتظار...
فيما يلي مثال على هذا الاستخدام:
الرمز البريدي: <asp:TextBox runat="server" id="zipCodeTextBox" />
<asp:زر التشغيل = "الخادم" onclick = "OnLookupButtonClick" Text = "انظر" />
<hr />
<asp:FormView runat="server" DataSourceID="weatherDS">
<قالب العنصر>
<asp: تسمية التشغيل = "الخادم"
Text='<%# Eval("درجة الحرارة"، "درجة الحرارة الحالية هي {0}.") %>' />
</قالب العنصر>
</asp:فورمفيو>
<nk:WeatherDataSource runat="server" id="weatherDS" ZipCode="98052" />
<script runat="server">
باطلة خاصة OnLookupButtonClick(object sender, EventArgs e) {
WeatherDS.ZipCode = zipCodeTextBox.Text.Trim();
}
</script>
يقوم هذا الرمز بتعيين الرمز البريدي استجابةً لإدخال المستخدم، مما يتسبب في قيام مصدر البيانات بإصدار إشعار تغيير، مما يتسبب في قيام عنصر التحكم FormView المنضم بتنفيذ ربط البيانات وتغيير العرض.
الآن، يتم تضمين رمز الوصول إلى البيانات في عنصر تحكم مصدر البيانات. بالإضافة إلى ذلك، يمكّن هذا النموذج موقع Weather.com (باللغة الإنجليزية) من نشر مكون يمكنه أيضًا تغليف تفاصيل خاصة بخدمته. نأمل أن تنجح. بالإضافة إلى ذلك، تسمح واجهة مصدر البيانات المجردة لـ FormView بالعمل مع بيانات الطقس فقط.
في المقالة التالية، ستقوم بتحسين التحكم في مصدر البيانات للتعامل تلقائيًا مع التغييرات في قيمة عامل التصفية (أي الرمز البريدي) المستخدم للاستعلام عن البيانات.