-
الإعلانات
-
تسجيل عضوية جديدة في المنتدى 01/31/2016
السلام عليكم ورحمة الله وبركاته عزيزي العضو الجديد : حاليا رسالة الإيميل لتأكيد صحة إيميلكم تذهب للبريد العشوائي ( جاري حل المشكلة ) فإذا لم تجد رسالة التحقق من إيميلكم في صندوق الوارد لديكم إتجه للبريد العشوائي ( JUNK) وقم بتفعيل إشتراككم من هناك
-
-
عدد المشاركات
188 -
تاريخ الانضمام
-
تاريخ اخر زياره
السمعه بالموقع
3 عاديعن عبد الكريم
-
الرتبة
عضو
- تاريخ الميلاد 04/01/1985
طرق الإتصال
- MSN [email protected]
-
Website URL
http://kanaan85.wor
dpress.com/ - ICQ 0
معلومات الملف الشخصي
- الجنس ذكر
- الدولة : حلب-سوريا
-
تعرف إلى الواصفة ValidationAttribute وطريقة استخدامها
عبد الكريم posted سؤال in Microsoft Visual C#.NET
هناك عدة طرق للتحقق من قيم نموذج model منها في هذه المقالة سنتعرف إلى كيفية استخدام الفئة ValidationAttribute باختصار التطبيق الذي سنقوم به هو تعريف واصفة UnlikeAttribute مهمتها هي التحقق من عدم التطابق (الإختلاف) بين حقلين أو خاصيتين داخل فئة. اذا كنت قد استخدمت الواصفة CompareAttribute ستدرك أن ما سنقوم به الآن هو العكس تماما لمبدأ عمل Compare. حيث أن الفئة السابقة مهمتها التحقق من التطابق وبالتالي حدوث اختلاف بين قيمتين فهذا يعني أن النموذج غير صحيح وعليه يترتب إجراء مناسب لضمان سلامة وصحة البيانات. ولكن الواصفة UnlikeAttribute التي سنقوم بإنشائها ستكون مخالفة تماما. قد تتساءل ما الفائدة من ذلك؟ ببساطة في حال كنت قد قررت إضافة إمكانية تغير كلمة المرور للمستخدم داخل أحد تطبيقاتك فربما ستقرر بعدم السماح للمستخدم باستخدام نفس كلمة المرور الحالية ككلمة مرور جديدة! تجهيز مشروع الشيفرة التالية تظهر الفئة الجديدة مع التوابع التي سنحتاج إلى العمل عليها لإتمام المهمة C# [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]public class UnlikeAttribute : ValidationAttribute { private string otherPropertyName; private const string DefaultErrorMessage = "{0} must be different than {1}"; public UnlikeAttribute(string otherProperty) : base(DefaultErrorMessage) { otherPropertyName = otherProperty; } public override string FormatErrorMessage(string name) { } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { } } لاحظ أن كلا التابعين FormatErrorMessage و IsValid عبارة عن توابع معرفة داخل الفئة ValidationAttribute والآن نقوم بإعادة تعريفها داخل الفئة الجديدة وظيفة التابع FormatErrorMessage هو تهيئة رسالة الخطأ وذلك باستخدام الخاصية ErrorMessageString التابعة للفئة ValidationAttribute [1] ( سنقوم باستخدام هذه الخاصية لاحقا عند تعرف التابع) والآن لنقوم بتجهيز التابع IsValid على النحو التالي: C# (UnlikeAttribute) protected override ValidationResult IsValid(object value , ValidationContext validationConte { PropertyInfo otherProperty = validationContext.ObjectInstance .GetType() .GetProperty(otherPropertyName); // in case no property where found if (otherProperty == null) throw new IndexOutOfRangeException($"{otherPropertyName} does not exist"); // getting the value of the other property var otherPropertyValue = otherProperty.GetValue(validationContext.ObjectInstance); // if they are different, then the case is successful if (!Equals(value, otherPropertyValue)) return ValidationResult.Success; return new ValidationResult( FormatErrorMessage(validationContext.MemberName)); } بإختصار كما تلاحظ فإنه قد تم استخدام ميزة الإنعكاس في الدوت نت للوصول إلى قيمة الخاصية otherPropertyName ValidationContext هي عبارة عن فئة تستخدم لوصف البيئة التي قد تم فيها إجراء عملية الفحص. بمعنى آخر أن ValidationContext.ObjectInstance هو عبارة عن الكائن الذي يتم إجراء عليه عملية التحقق والآن لنجهز التابع FormatErrorMessage C# public override string FormatErrorMessage(string name) { return string.Format(ErrorMessageString, name, otherPropertyName); } والآن قم بإنشاء نموذج يمثل تغير كلمة المرور PasswordChangeModel ، وقم بإضافة الواصفة إلى الخاصية NewPassword ومرر قيمة الخاصية OldPassword لتقوم الواصفة لاحقا بالتحقق من إختلاف كلا قيمتهما public class PasswordChangeModel { public string OldPassword { get; set; } [Unlike("OldPassword")] public string NewPassword { get; set; } } كيفة استخدام الواصفة بعد إضافة الواصفة إلى الخاصية NewPassword لنجري عملية التحقق في أن كلمة المرور الجديدة لا تطابق القديمة كما يلي. لنذهب إلى التابع Main واكتب الأسطر التالية static void Main(string[] args) { var model = new PasswordChangeModel(); model.OldPassword = "1234"; model.NewPassword = "1234"; var list = new List<ValidationResult>(); if(!Validator.TryValidateObject(model, new ValidationContext(model, null, null), list, true)) { Console.WriteLine("Some errors found"); foreach (var item in list) Console.WriteLine(item.ErrorMessage); } } تم استخدام الفئة Validator واستدعاء التابع TryValidateObject لتقوم بدورها وباستدعاء التابع IsValid للواصفات المرتبطة بجميع الخصائص. والآن شغل البرنامج ناتج تنقيذ البرنامج يظهر تطابق قيمتي OldPassword و NewPassword في حين يتوجب إختلافهما كما تلاحظ رسالة الخطأ قد ظهرت وهي تظهر أن كلمة المرور متطابقة ويستلزم من المستخدم تغير كلمة المرور الجديدة بحيث تكون مختلفة عن القديمة ، وبهذا الشكل نكون قد تعرفنا إلى كيفية استخدام الفئة ValidationAttribute لتعريف واصفة خاصة بك. أمور إضافية قد تود تطبيقها لنظهر أسماء الخصائص الظاهرة في رسالة الخطأ ربما تود إظهار أسماء الخصائص الظاهر بالرسالة بطريقة أفضل للمستخدم يمكننا استخدام الواصفة DisplayNameAttribute أو DisplayAttribute ، سنقوم باستخدام الواصفة DisplayAttribute إذ أن الأولى توفر إمكانية الربط مع ملف resx في حين الأخيرة لا توفر هذه الخاصية والآن لنجري التعديلات على الفئتين PasswordChangeModel و UnlikeAttribute على النحو التالي: C# public class PasswordChangeModel { [Display(Name = "Old Password")] public string OldPassword { get; set; } [Display(Name = "New Password")] [Unlike("OldPassword")] public string NewPassword { get; set; } } والآن C# [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] public class UnlikeAttribute : ValidationAttribute { private string otherPropertyName; private string otherPropertyDisplay; private const string DefaultErrorMessage = "{0} must be different than {1}"; public UnlikeAttribute(string otherProperty) : base(DefaultErrorMessage) { otherPropertyName = otherProperty; } public override string FormatErrorMessage(string name) { return string.Format(ErrorMessageString, name, otherPropertyDisplay); } protected override ValidationResult IsValid(object value, ValidationContext validationContext { PropertyInfo otherProperty = validationContext.ObjectInstance .GetType() .GetProperty(otherPropertyName); // in case no property where found if (otherProperty == null) throw new IndexOutOfRangeException($"{otherPropertyName} does not exist"); // getting the value of the other property var otherPropertyValue = otherProperty.GetValue(validationContext.ObjectInstance); // if they are different, then the case is successful if (!Equals(value, otherPropertyValue)) return ValidationResult.Success; // checks if DisplayAttribute has been used if (!IsDefined(otherProperty, typeof(DisplayAttribute))) return new ValidationResult( FormatErrorMessage(validationContext.MemberName)); // gets the DisplayAttribute.Name var displayAttribute = (DisplayAttribute) otherProperty.GetCustomAttribute(typeof(DisplayAttribute)); return new ValidationResult(FormatErrorMessage(validationContext.MemberName)); } } تم تظليل التغيرات التي طرأت على الشيفرة لاحظ كيف ظهرت الأسماء بناء على الواصفة NameAttribute ماذا لو أردت استخدام ملف resources.resx الأمر سهل جدا قم بإضافة نوع المصدر ResourceType محتوى ملف AppResource.resx والآن عد إلى الفئة PasswordChangeModel وأضف المصدر الذي تود للواصفة Display الربط معه C# public class PasswordChangeModel { [Display(Name = "OldPassword", ResourceType = typeof(AppResource))] public string OldPassword { get; set; } [Display(Name = "NewPassword", ResourceType = typeof(AppResource))] [Unlike("OldPassword")] public string NewPassword { get; set; }} عدل UnlikeAttribute على النحو التالي: C# protected override ValidationResult IsValid(object value, ValidationContext validationConte { PropertyInfo otherProperty = validationContext.ObjectInstance .GetType() .GetProperty(otherPropertyName); // in case no property where found if (otherProperty == null) throw new IndexOutOfRangeException($"{otherPropertyName} does not exist"); // getting the value of the other property var otherPropertyValue = otherProperty.GetValue(validationContext.ObjectInstance); // if they are different, then the case is successful if (!Equals(value, otherPropertyValue)) return ValidationResult.Success; // checks if DisplayAttribute has been used if (!IsDefined(otherProperty, typeof(DisplayAttribute))) return new ValidationResult(FormatErrorMessage(validationContext.MemberName)); // gets the DisplayAttribute.Name var displayAttribute = (DisplayAttribute)otherProperty.GetCustomAttribute(typeof(DisplayAttribute)); // checks if Resource is bound if (displayAttribute.ResourceType != null) { var manager = new ResourceManager(displayAttribute.ResourceType); otherPropertyDisplay = manager.GetString(otherPropertyName); return new ValidationResult( FormatErrorMessage(manager.GetString(validationContext.MemberName))); } return new ValidationResult(FormatErrorMessage(validationContext.MemberName)); } لاحظ قد ظهرت الأسماء كما هي مخزنة في AppResources.resx الشيفرة المصدرية: https://github.com/a-kanaan/SharedWorkspace/tree/master/UnlikeAttributeConsoleApp المصادر: https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationattribute.formaterrormessage(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationcontext(v=vs.110).aspx المدونة -
كيف تستخدم حلقة foreach واحدة للحصول على قيم من مجموعتين مختلفتين؟!
عبد الكريم posted سؤال in Microsoft Visual C#.NET
السلام عليكم وأهلا بكم هل ترغب في أن تحصل على أكثر من قيمة من أكثر من مجموعة باستخدام تعليمة foreach واحدة؟ لنقل أنه لديك مجموعات (مصفوفتان) وترغب باستخدام حلقة foreach واحدة لمعالجة كلا المصفوفتين؟ الحل بسيط جدا ففي دوت نت الإصدار الرابع قد تم إضافة تابع ملحق جديد يدعى Zip. باختصار وظيفة التابع هو الدمج بين مجموعتين وذلك من خلال توفير العنصر ومقابله من كلا المجموعتين حسب الدليل index الحالي. طبعا اذا كان كلا المجموعتين ذات بعد متساو فلا بأس أما إن لم يكونا كذلك فإن التابع سوف يتوقف عند الوصول لآخر عنصر من أحد المجموعتين. لاحظ المثال التالي: مثال سي شارب var numbersInWords = new[] { "One", "Two", "Three" }; var numbers = new int[] { 1, 2, 3 }; foreach(var item in numbers.Zip(numbersInWords, (n, nw) => new { Number = n , Word = nw})) { Console.WriteLine($"{item.Number}: {item.Word}"); } نفذ البرنامج السابق لتحصل على: ناتج خرج تنفيذ الشيفرة السابقة PS C:\Sample> dotnet run 1: One 2: Two 3: Three المصادر: [1]. https://stackoverflow.com/questions/1955766/iterate-two-lists-or-arrays-with-one-foreach-statement-in-c-sharp https://barmjah.wordpress.com/ -
عبد الكريم أعطى سمعة إيجابية لــ رد في موضوع: احتقار اللغة العربية من المبرمجين العرب
-
اذا كنت قد استخدمت ون درايف سابقا فربما قد صادفتك مشكلة عندما أردت إضافة حساب شخصي آخر. حيث أن مايكروسوفت لا تسمح بربط أكثر من حساب شخصي واحد على نظام التشغيل. ولكن هناك طريقة أخرى نظامية تؤمن لك إضافة حساب ثاني وثالث إلى حاسبتك فقط اتبع الخطوات التالية: أدخل إلى حسابك الثانوي الجديد من خلال المتصفح ثم قم بإنشاء مجلد داخل الحساب يمكن أن تسميه مثلا "ملفات مشتركة" انقل محتويات ون درايف كاملا إلى هذا المجلد اختر المجلد الجديد واختر من القائمة "مشاركة" في نافذة المشاركة ، اختر مشاركة عبر البريد الإلكتروني (لاحظ الصورة التالية) أدخل عنوان البريد الإلكتروني الأساسي الذي تود من خلاله الوصول إلى محتويات ون درايف الثانوي ستصل لك رسالة إلى بريدك الإلكتروني الأساسي تعلمك أنه قد مشاركتك مجلد من حساب آخر (حسابك الثانوي) انقر على الزر داخل الرسالة ليقوم المتصفح بفتح المجلد المشارك معك ستلاحظ في الصفحة هناك زر "إضافة إلى ون درايف الخاص بك" ، انقر عليه (لاحظ الصورة التالية) وبعدها ستلاحظ أن المجلد الجديد قد ظهر ضمن حسابك الرئيسي في ون درايف على حاسبتك المصادر: [1]. http://windowsreport.com/two-onedrive-accounts/ https://barmjah.wordpress.com/
-
أحد القيم المدخلة في الحقول النصية ليس برقم
-
عبد الكريم بدأ بمتابعة خاطرة في تصميم التوابع Methods
-
هذا الكود مقتبس من كتاب مايكروسوفت Programming in C#. في هذا الكود فقط أود أن أتطرق إلى نقطة وهي أيّ (بتشديد الياء) التابعين أفضل من حيث البيانات (البرامترات) الممررة إليه؟ سأترك لك أولا وقت للتفكير،، //LISTING 1 Passing a complete customer to a method public Distance CalculateDistanceTo(Customer customer) { Distance result = … // Some difficult calculation that uses customer.Address return result; } //LISTING 2 Passing only an address to a method public Distance CalculateDistanceTo(Address address) { Distance result = … // Some difficult calculation that uses address return result; } لكن إن أردت إشارات لتساعدك على الإختيار بنفسك فلك ذلك، سأطرح عليك بعض النقاط 1. أيّ الكودين يعتبر أوضح و أسهل للفهم من حيث البيانات المطلوبة لإجراء عملية حساب المسافة؟ 2. أيّ الكودين فيه سهولة في الصيانة مقارنة بالآخر؟ أو بمعنى آخر أي الكودين يمكننا استخدامه أكثر من الآخر دون إجراء تعديلات؟ مرة أخرى ركز على البيانات (البرامتر) الممرر لكلا التابعين. طبعا الإجابة على كلا السؤالين هو الكود الثاني. بالنسبة للسؤال الأول،، طبعا الكود الثاني أوضح وأسهل للفهم وذلك لأنه واضح من حيث متطلبات عمله فهو يطلب عنوان حتى يقوم بعملية حساب المسافة، في حين أن التابع الأول مبهم، فأنت ببساطة لا يمكنك استنباط أي البيانات التي يحتاجها التابع من الكائن من صنف Customer للعمل. بمعنى آخر لا تعلم أي البيانات المجودة داخل هذا الكائن من صنف Customer التي سوف يعتمد عليها في تقرير المسافة ربما يكون العنوان وقد يكون رمز المنطقة Postcode أو رمز الهاتف لتحديد المدينة أو… قد يتبادر إلى ذهنك وما المشكلة في ذلك؟ لنفترض أنك تريد حساب المسافة لكل الزبائن المعروضين في جدول للزبائن الذين أجروا عملية شراء خلال الشهر الماضي في أحد واجهات لتطبيقك الجميل. طبعا الجدول لن يحتوي جميع معلومات الزبائن وإنما يعرض فقط بعض المعلومات عنهم. عندما تريد أن تحسب المسافة لزبون معين ستضطر عندما تستخدم التابع الأول لتأمين معلومات الزبون كاملة من قاعدة البيانات قبل تمريرها للتابع الأول لتتم عملية الحساب، بينما التابع الثاني لا يتطلب منك سوى العنوان والذي في أغلب الظن قد يكون متوفر ولا تحتاج إلى الاستعلام عنه من قاعدة البيانات. على كل إن لم تقتنع فلا مشكلة فالسبب الثاني سيكون كفيل بتبيهك إلى أمر أكثر أهمية والذي ستخلص من خلاله إلى أن تصميم الكود الثاني هو الأفضل بلا منازع. بالنسبة للسؤال الثاني،، لنفترض بعد مدة من الزمن تم التعديل على الصنف Customer ليحتوي حقل جديد WorkAddress مالذي سوف يحدث؟! لن تكون قادرا على استخدام التابع الأول لحساب المسافة باستخدام الحقل الجديد WorkAddress. أليس كذلك؟! ومع ذلك إن ألححت بمقدرتك على استخدام التابع الأول سيتطلب منك تعديل التابع الأول حتى يتثنى لك حساب المسافة لكل من Address و WorkAddress. لن أتطرق إلى كيفية التعديل، إذا أنه ومع الشروع بالتعديل ستكتشف العديد من المشاكل الأخرى. في حين وبكل سهولة يمكنك حساب المسافة للحقل الجديد WorkAddress بتمريره كبرامتر إلىه. حالة أخرى توضح مدى المشاكل التي يمكن أن تحصل فقط جراء سوء تصميم التابع الأول. لنقل أننا أردنا استخدام التابع مع مشروع آخر أو مع صنف آخر مثل Student، مرة أخرى لا يمكنك استخدام التابع الأول حيث أن Customer غير Student وبالتالي سيتطلب إجراء تعديلات ليتلائم التابع الأول مع الصنف الجديد Student. بينما لو استخدمنا التابع الثاني لن نواجه أي من المشاكل السابقة وعلى العكس ستشعر بمتعة حسن تصميم التابع. الخلاصة: ان التابع الثاني أفضل من التابع الأول فهو سهل الفهم وأيضا لا يتطلب عملية تعديل على أقل تقدير للحالات آنفة الذكر.
-
عبد الكريم أعطى سمعة إيجابية لــ إجابة على سؤال: خطأ في مصفوفة
-
عبد الكريم أعطى سمعة إيجابية لــ إجابة على سؤال: كيف ارتب المصفوفة من الاصغر للاكبر ؟؟
-
هل يمكن انشاء المصفوفات بشكل ديناميكي
عبد الكريم رد على زينب هادي's موضوع في Microsoft Visual C#.NET
مصفوفه المصفوفات هي عبارة عن مصفوفه عادية كأي مصفوفه من نوع عدد حقيقي أو سلسله نصيه، مثال: مصفوفه عادية من نوع عدد صحيح ستكون على الشكل التالي: int[] a = new inte[4]; ولكن مصفوفه من مصفوفات عدد حقيقي هي على الشكل التالي: int[][] b = new int[3][5]; وبالتالي المصفوفه b هي عبارة عن مصفوفه تحوي 3 خلايا وكل خليه تحوي مصفوفه من 5 خلايا لاعداد جقيقية هي تدعى Jagged Arrays http://msdn.microsoft.com/en-us/library/2s05feca.aspx -
هل يمكن انشاء المصفوفات بشكل ديناميكي
عبد الكريم رد على زينب هادي's موضوع في Microsoft Visual C#.NET
وعليكم السلام ورحمة الله وبركاته بالنسبه للطلب الاول وهو أن عدد المصفوفات غير معروف، فيمكن في هذه الحالة أن تنشئ مصفوفة المصفوفات وهي مصفوفه عناصرها مصفوفه. بالنسبه للنقطه الثانية وهي أن بعد المصفوفه غير معروف، ففي هذه الحالة أطلبي من المستخدم أن يحدد أبعاد المصفوفه. داخل الكود قومي بفحص خيار الذي اختاره المستخدم وعلى اساسه نفذي الكود المناسب وشكرا -
tareq1176 أعطى سمعة إيجابية لــ إجابة على سؤال: Regular Expressions كيف اضع حد ادنى وحد اعلى للحروف
-
الحمد لله :)
-
:) جرب هذا <asp:TextBox ID="txt2" runat="server"></asp:TextBox> <asp:RegularExpressionValidator ID="RegularExpressionValidator1" ValidationExpression="^[\u0621-\u064A\040]{3,6}$" runat="server" ControlToValidate="txt2" ErrorMessage="RegularExpressionValidator" /> حيث انه التعبير النظامي هو: ^[\u0621-\u064A\040]{3,6}$ يسمح هذا التعبير بإدخال من 3 إلى سته محارف عربية مع فراغاتها أرجوا أن اكون قد أجبت على السؤال بشكل صحيح. وإن لم يكن فلا تتردد. :)
- 13 ردود
-
1
-
لا يا اخي, لاحظ ان المثال الذي كتب يحوي على فراغات فقد جربتها وهي تعمل بنجاح. أرجوا إعادة النظر في المثال, وأي سؤال آخر لا تتردد به. :)
-
السلام عليكم ورحمة الله إن شاء الله, هذا ما تبحث عنه. string s = "ذهب التلميذ إلى المدرسة ليلعب كرة القدم مع زملائه"; Regex r = new Regex(@"\b[\u0621-\u064A]{3}\b"); foreach (Match m in r.Matches(s)) { Console.WriteLine(m.Value); }
-
bulbul أعطى سمعة إيجابية لــ إجابة على سؤال: Regular Expressions كيف اضع حد ادنى وحد اعلى للحروف
-
وعليكم السلام ورحمة الله وبركاته ^[\u0621-\u064A\040]+{minimum, maximum}$ جرب هذه الطريقة أرجوا أنها ستعمل بشكل صحيح. يمكنك ايضا الرجوع إلى هذه المقالة: http://www.radsoftware.com.au/articles/regexlearnsyntax.aspx وشكرا,,
- 13 ردود
-
1
-
سؤال حول واجهه الوثائق المتعدده
عبد الكريم رد على ahmed abd elsatter's موضوع في قسم تكنولوجيا Microsoft .NET العام
وعليكم السلام ورحمة الله وانت لشو بدك تخفيها, احذفها من الاصل اذا ما كانت لازمة؟ -
كيفية عمل شريط متحرك يجلب البيانات من الداتا بيس بشرط قيمة حقل معين
عبد الكريم رد على asalah_b15's موضوع في قسم تكنولوجيا Microsoft .NET العام
http://www.codeproject.com/KB/miscctrl/csmarquee.aspx http://www.java2s.com/Code/CSharp/Components/MarqueeLabelDemo.htm -
وعليكم السلام ورحمة الله ينمكنك استخدام MaskedTextBox في Windows Application أما بالنسبه للـ ASP.NET أعتقد انك بحاجة لكود JavaScript هذا مثال: http://www.webdoubt.com/how-to-create-a-masked-textbox-using-javascript/ مثال آخر: http://www.codeproject.com/answers/51736/Masked-textbox.aspx