الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الطرق المختصرة فى البرمجة

بدأه هانى عوض في 3 نوفمبر 2011 · 23 رد · 3,748 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

تحية طيبة

مما لا شك فيه أن البرمجة فى حد ذاتها لا تتطلب دراسة أكاديمية بحتة فقط للحصول على برنامج صحيح وخالى من الأخطاء بل تتطلب قدر كبير من المهارة فى كيفية تشكيل الكود مع مراعاة سهولة التعديل فيها بعد أو إذا كان سيعمل عليه مبرمج آخر فيما بعد..

لذا قررت من بداية العمل على تطبيقات C# أن أتخذ أقصر الطرق للحصول على كود أكثر مرونة وأسهل فى التعديل. وسوف أقوم تباعاً بوضع بعض الوظائف القصيرة التى تفيد فى البرمجة، ولن يقتصر عرض الكود فقط على القراءة العابرة، بل أحب أن أتشارك معكم وجهات النظر والخبرات للوصول إلى أفضل وأقصر الطرق للحصول على كود متميز..

سأبدأ معكم:

# كود 1 #

توضيح: الكود التالى يستخدم فى إخفاء الأعمدة فى DataGridView .

المثال:

dgvName.Columns["colName1"].Visible = false;
dgvName.Columns["colName2"].Visible = false;
dgvName.Columns["colName3"].Visible = false;
dgvName.Columns["colName4"].Visible = false;
dgvName.Columns["colName5"].Visible = false;

الطريقة المختصرة:

        public void dgvColVisible(DataGridView dgv, params string[] strColName)
        {
            foreach (string str in strColName)
            {
                dgv.Columns[str].Visible = false;
            }
        }

طريقة العمل:

dgvColVisible(dgvName, "colName1", "colName2", "colName3", "colName4", "colName5");

ومن لديه أفكار أخرى فليضعها لتعم الفائدة

تقبلوا فائق تحياتى

هانى عوض

6
#2

السلام عليكم ...

موضوع أكثر من جيد ..

دعنا نسمي هذا بالــ Tips ... التي تسرع تطوير البرامج ...

الــ Tip الخاصة بي .. هي انه لو عندنا فورم و عليه عدة خانات نص و بالاسفل زر حفظ و يريد المستخدم أن يدخل البيانات في الأولى ثم يضغط انتر لينتقل للخانة الثانية ثم يدخل البيانات و يضغط انتر للإنتقال للثالثة .. يستخدم الكود التالي ...

private void FrmCityEdit_KeyPress(object sender, KeyPressEventArgs e)
    	{
        	if (e.KeyChar == (char)13)
        	{
            	Control c = GetNextControl(ActiveControl, true);
            	if (!(c == null))
            	{
                	c.Focus();
                	e.Handled = true;
                	this.ActiveControl = c;
            	}
            	else
                	this.ActiveControl = cmbCountryID;

        	}
    	}

بشرط ان يكون KeyPreview = true للفورم ..و تكون خانات النص مرتبة بشكل متتالي (من ناحية زر الــ Tab) ..

نضغط على الزر Tab Order .. الموضح بالصورة ثم نحدد خانات النص بالضغط عليها حسب الترتيب المطلوب ..

post-94677-047078900 1320344927_thumb.pn

ملاحظة :

يوجد كتاب Effective C# 4.0 يتكلم عن أمور شبيهة بالموضوع الذي نتحدث عنه ..(الرابط غير متوفر عندي للأسف)

و كذلك كتاب C# 3.0 Best Practices ..

المرفقات
TabOrder.png

تم تعديل هذه المشاركة بواسطة houssam11350_11350 في 3 نوفمبر 2011 في 21:37

7

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3

السلام عليكم ورحمة الله وبركاته.

جزاك الله خير اخ هاني عوض على هذه المشاركة الرائعة.

houssam11350_11350 التطبيق الي كتبته ذكرني بنفسي كتبت كود طويل فيه switch للتنقل بين التكيست بوكسس بالانتر والباك سبيس , فعلا العلم نور :happy: , عموماً اشكرك على هذا المثال وجزاك الله خير.

اقتباس

يوجد كتاب Effective C# 4.0 يتكلم عن أمور شبيهة بالموضوع الذي نتحدث عنه ..(الرابط غير متوفر عندي للأسف)

الصراحة فتحت شهيتي لقراءة الكتاب , بحثت عنه وحملته من هذا الرابط

ملاحظة:

لتحميل الكتاب في نهاية هذا الرابط يوجد زر I'm Feeling Lucky اضغط عليه, ستظهر نافذة اخرى في نهايتها زر مكتوب عليه اسم الكتاب اضغط عليه ليبدأ التحميل.

تمناتي لكم بالتوفيق.

6

((إِنَّ اللَّهَ وَمَلائِكَتَهُ يُصَلُّونَ عَلَى النَّبِيِّ يَا أَيُّهَا الَّذِينَ آمَنُوا صَلُّوا عَلَيْهِ وَسَلِّمُوا تَسْلِيمًا))

#4

السلام عليكم،

الموضوع رائع :-) و يمشي على طريقين (أحيانا مختلفين): اقصر طريق والـTips التي تسرع تطوير البرامج

أقول شيء ليكون في كلا المنهجين :)

استخدام Bitwise Operators

نفترض سنقوم بتغيير Style نص بإستخدام CheckBox.

بما أن FontStyle يدعم Bitwise combinations فهكذا:

private void boldCheckBox_CheckedChanged(object sender, EventArgs e)
{
	outputLabel.Font = new Font(outputLabel.Font, outputLabel.Font.Style ^ FontStyle.Bold);
}

private void obliqueCheckBox_CheckedChanged(
   object sender, EventArgs e)
{
	outputLabel.Font = new Font(outputLabel.Font, outputLabel.Font.Style ^ FontStyle.Italic);
}

post-247423-084639600 1320398046_thumb.p

بهذا الشكل اكتفينا بخط واحد بدلا من استخدام كود طويل و بإستخدام nested-if

المرفقات
BitwiseOperator.png

تم تعديل هذه المشاركة بواسطة موليان في 4 نوفمبر 2011 في 13:10

3

..:: رَبِّ زِدْني عِلْمًا ::..

#5

السلام عليكم...

موضوع متميز جدا....جزاكم الله كل خير

و هذا كود لاختصار تعلميات if ..else ضمن method معينة تتطلب استخدام if else اكثر من مرة

من اجل احضار text لل radioButton

 delegate string mydel();//define a delegate

private void button1_Click(object sender, EventArgs e)
{
            mydel m = () => { return (radioButton1.Checked) ? radioButton1.Text : radioButton2.Text; };

//then you can use m() in anywhere
textBox1.Text = m();
label1.Text = m();
}

تم تعديل هذه المشاركة بواسطة Hisham_IT في 4 نوفمبر 2011 في 14:48

1

Currently working on ASP.net ..... come Back Soon

#6

تحية طيبة

شكراً جزيلاً للأخوة الأعضاء الكرام على تفاعلهم المتميز فى إثراء المنتدى بمثل هذه الأفكار...

وأحب أن أشير إلى أن الموضوع لايقتصر على وضع الكود المختصر فقط بل الباب مفتوح للمناقشة وإبداء الآراء

مرة أخرى أقدم لكم كل الشكر والتقدير..

وجارى تحضير الكود التالى..

#7

# كود 2 #

كثيراً ما نحتاج العمليات الحسابية داخل DataGridView واستخدام المعادلات منها البسيطة ومنها المعقدة ، فى حساب القيمة الناتجة من الكمية الخاصة بالصنف مضروبة فى السعر وأيضاً حالات الخصم على الصنف سواء نسبة أو مبلغ .. بالأخص فى البرامج المخزنية..

توضيح: الكود التالى يستخدم لعمل بعض العمليات الحسابية فى DataGridView .

        enum calcOperation { Add, Sub, Mult, Div, Percent, prePercent, DiscPercent }


        private Double calcDgvCol(DataGridView dgv, int RowIndex, String ColName1, String ColName2, String ColumnResultName, calcOperation Opr)
        {
            double Total = 0;
            double val1 = 0;
            double val2 = 0;
            try
            {
                try
                {
                    val1 = Convert.ToDouble(dgv[ColName1, RowIndex].Value.ToString());

                }
                catch { val1 = 0; }

                try
                {
                    val2 = Convert.ToDouble(dgv[ColName2, RowIndex].Value.ToString());
                }
                catch { val2 = 0; }

                switch (Opr)
                {
                    case calcOperation.Add:
                        Total = val1 + val2;
                        break;
                    case calcOperation.Sub:
                        Total = val1 - val2;
                        break;
                    case calcOperation.Mult:
                        Total = val1 * val2;
                        break;
                    case calcOperation.Div:
                        Total = val1 / val2;
                        break;
                    case calcOperation.Percent:
                        Total = val1 * val2 / 100 + val2;
                        break;
                    case calcOperation.prePercent:
                        Total = val1 * 100 / val2 - 100;
                        break;
                    case calcOperation.DiscPercent:
                        Total = val1 - ((val2 * val1) / 100);

                        break;
                }

                dgv[ColumnResultName, RowIndex].Value = Total.ToString("0,0.00");


                return Total;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return Total;
        }

ويمكن استخدام هذه الوظيفة هكذا:

                 private Double Gross
        {
            get
            {
                for (int i = 0; i < dgvPurSub.Rows.Count - 1; i++)
                {
                    calcDgvCol(dgvPurSub, i, "Price", "Qty", "Total", calcOperation.Mult);
                }
                return GrossCol("Total");
            }

        }

حيث يمكن بهذه الطريقة عمل العمليات الحسابية بسهولة (جمع وضرب وقسمة واستخراج النسبة المئوية الخ..) داخل DataGridView.

وأرحب بأى تعليق أو استفسار أو إضافة متميزة لفكرة الحصول على العمليات الحسابية من داخل DataGridView

تقبلوا فائق التحية

#8

فكرة جميله جدا

واحببت الكتاب Effective C# 4.0

باذن الله ساقوم بادراج بعض ال tips من الكتاب من بعد اذنكم

شكرا

#9
R@ND_CiS كتب:

فكرة جميله جدا

واحببت الكتاب Effective C# 4.0

باذن الله ساقوم بادراج بعض ال tips من الكتاب من بعد اذنكم

شكرا

على الرحب والسعة

#10

السلام عليكم.

موضوع جميل والشكر موصول لكاتبه

سأشارك بالتالي:

لو كان لديك برنامج فيه جزء للبحث في قاعدة البيانات

لنفترض أن لدينا 3 TextBoxes الأول خاص بحقل الاسم والثاني العمل والثالث مكان الإقامة,

أمر الاستعلام حينئذ بهذا الشكل:

string QueryString = "Select * from tblPersons";
bool flag = false;
if(txtName.Text !="")
{
QueryString += (flag==false? " where ":" and ") +"personName='"+txtName.Text+"'";
flag = true;
}
if(txtJob.Text !="")
{
QueryString += (flag==false? " where ":" and ") +"personJob='"+txtJob.Text+"'";
flag = true;
}
if(txtLocation.Text !="")
{
QueryString += (flag==false? " where ":" and ") +"personLocation='"+txtLocation.Text+"'";
flag = true;
}
System.Data.OleDb.OleDbDataAdapter DA = new System.Data.OleDb.OleDbDataAdapter (QueryString,Con);

على افتراض أن Con هي كائن الاتصال.

بالفعل نجد الكود السابق كبير ويمكن الوقوع بخطأ بسهولة وقتها (هذا فقط لثلاثة صناديق نص !!)

لذا فكرت وتوصلت لطريقة أكثر إيجازا

نقوم بوضع صناديق البحث في Panel معين وليكن اسمه pnlSearch , والخطوة الثانية نقوم بوضع اسم الحقل المرتبط بكل صندوق نص في الخاصية Tag الخاصة به,ثم ببساطة نستخدم الكود التالي للبحث:

 bool flag = false;
            string queryString = "Select * from tblPersons";
            foreach (Control  b in pnlSearch.Controls)           
                if (b is TextBox && b.Text !="" && b.Tag !=null)
                {
                    queryString += (flag ? " and " : " where ") + b.Tag.ToString() + "='" + b.Text + "'";
                    flag = true;
                }

System.Data.OleDb.OleDbDataAdapter DA = new System.Data.OleDb.OleDbDataAdapter (QueryString,Con);

ببساطة أصبح لا يهم عدد الTextBoxes.

تم تعديل هذه المشاركة بواسطة Mohammed Asaad في 28 نوفمبر 2011 في 17:19

1
#11

مرحباً بك أخى الكريم

بالفعل مشاركة متميزة أحييك عليها..

إضافة: يمكن الحصول على نتائج متشابهة (ليست مطابقة) بتعديل السطر التالى باستخدام Like:

                    queryString += (flag ? " and " : " where ") + b.Tag.ToString() + " Like '%" + b.Text + "%'";

تقبل فائق تحياتى

تم تعديل هذه المشاركة بواسطة هانى عوض في 29 نوفمبر 2011 في 14:50

#12

حياك الله أخ هاني,

طبعا لا ننسى أن من سبل الاختصار في كتابة الأكواد ما يسمى بالاستدعاء الذاتي للدالة,

الكود التالي كنت قد كتبته مرة لحساب قيمة Fibonacci للحد المطلوب,


{
if(a==1) return 1;
if(a==2) return 1;
int x=a;
int c = 0, a0=0, a1=0;
a0 = 1; a1 = 1;
c = 2;
while (c < x)
{
int temp = a1;
a1 = a0 + temp;
a0 = temp;
c++;
}
return a1;
}
int Fibonacci(int a)

لسبب ما كنت أتصفح موقع معين وعثرت على كود أبسط بكثير بل ومفهوم أيضا يماثل الدالة السابقة بوظيفتها:


{
return (i <= 1 ? i : Fibonacci(i - 1) + Fibonacci(i - 2));
}
public static int Fibonacci(this int i)

شخصيا ضحكت على نفسي من بساطة الدالة الثانية.

بالمناسبة لمن لا يعرف ما هي متسلسة

Fibonacci

, هي متسلسلة رقمية بالشكل التالي:

اقتباس
1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , .....

لاحظ أن كل عدد يساوي مجموع العددين السابقين له.

تحياتي

تم تعديل هذه المشاركة بواسطة Mohammed Asaad في 6 ديسمبر 2011 في 10:00

1
#13

كل التحية والتقدير لمشاركتك أخى Mohammed Asaad

# كود 3 #

ماهى أقصر طريقة للحصول على مسارات كافة الملفات الخاصة بامتداد معين وليكن Pdf من مجموعة مجلدات ومجلدات فرعية ؟

string[] pdfFiles = Directory.GetFiles(@UrFolderPath, "*.pdf", SearchOption.AllDirectories);

وإرجاع القيمة كالتالى:

foreach (string pdffile in pdfFiles)
            {
// أكتب هنا ماتريده
}

مجرد فكرة عابرة...

مع فائق التحية

#14

# كود 4 #

ماهى أقصر طريقة للحذف داخل مصفوف String Array؟

                    strName = "Hany";

                    items = Array.FindAll(items, val => val != strName);

حيث items هى المصفوفة المراد الحذف منها الاسم "Hany"

مجرد فكرة عابرة...

مع فائق التحية

#15

اجاد الindex ثم اسخدام خصية remove وتمرير الindex

#16
KARIMSOFT كتب:

اجاد الindex ثم اسخدام خصية remove وتمرير الindex

تمام ... هذا مانتبعه عادة لعمل Remove من الـ Array

ولكن الكود المرفق مع السؤال أقصر..(حيث أن السؤال أسفله الإجابة.. للتوضيح لعلك لم تلاحظ الكود)

تقبل فائق التحية

#17

جزاك الله كل الخير ولكن طريقة اكثر بطئن اذا ككنت متاكد انه لا يوجد سوي عنصر واحد مساوي للمطلوب طريقتك تعتمد علي المسح الكلي وهذا يفيد اذا كان هناك اكثر منن عنصر مطلوب حذفهم

#18

بعد التحية

استكمالاً للموضوع

# كود 5 #

ماهى أقصر الطرق فى استخدام DataBindings؟

لنفرض أنه لدينا فورم تحوى بيانات العملاء .. (كود - الاسم - العنوان - المهنة - التليفون - الجوال 1 - الجوال 2 - البريد الالكترونى - الموقع الالكترونى - ت بدء التعامل - الحالة (نشط / غير نشط) - ملاحظات) أى بمالايقل عن 12 عمود!! فما هو الحال..

فى الطرق المعتادة يتم كتابة 12 سطر للربط .. مع مراعاة اختلاف الربط بالنسبة لـ textbox , datetimepicker , checkbox ...

لهذا فكرت أن أقوم بعمل Method تقوم بدورها بعمل الربط التلقائى وهذا هو شكلها النهائى بعد محاولات لتقليل الكود:

        private void bindTxt(Control ctrl, BindingSource bs, string strFormat)
        {
            try
            {
                foreach (Control c in ctrl.Controls)
                {
                    if (c.GetType() == typeof(TextBox))
                    {
                        c.DataBindings.Add(new Binding("Text", bs, c.Name.Remove(0, 3).ToString(), true, DataSourceUpdateMode.OnPropertyChanged, null, strFormat));
                    }
                    if (c.GetType() == typeof(DateTimePicker))
                    {
                        c.DataBindings.Add(new Binding("Value", bs, c.Name.Remove(0, 3).ToString(), true, DataSourceUpdateMode.OnPropertyChanged, null, strFormat));
                    }
                    if  (c.GetType() == typeof(CheckBox))
                    {
                        c.DataBindings.Add(new Binding("CheckState", bs, c.Name.Remove(0, 3).ToString(), true, DataSourceUpdateMode.OnPropertyChanged, null, strFormat));
                    }
                }


            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

مع مراعاة التالى عند الاستخدام:

1- وضع كافة العناصر المراد ربطها بحاوية

(Container (GroupBox / Panel

2- التسمية الصحيحة لكل عنصر كالتالى :

اسم العمود فى الجدول مسبوقاً بثلاثة حروف فقط للتعريف مثلاً

txtClientName

dtpFDate

chkStatus

وهكذا..

ويتم الاستدعاء كالتالى:

                bindTxt(grpCust, bsCust, null);

على اعتبار أن bsCust هى BindingSource التى تحوى الجدول

وشكراً للمتابعة.

#19

السلام عليكم ورحمة الله وبركاته

موضوع متميز.. وأقل ما يقال عنه أنه رائع :)

جميل أن تكون هناك طرق مختصرة في البرمجة.. ولا شك أنها فعالة

اقتباس

ماهى أقصر الطرق فى استخدام DataBindings؟

رائع.. مشاركة ممتازة وجاءت في وقتها لأني بحاجة لمعرفة تلك الطرق

أشكرك على هذا الطرح القيم.. ومن المتابعين للموضوع إن شاء الله

تحياتي

#20

جزاكم الله خيرا

اللهم صلي و سلم و بارك على سيد الخلق محمد و على آله و صحبة و من تبعة بإحسان و سلم تسليما كثيرا

#21

اتمنى ان توثق هذه المشاركات وان تكون قابلة للتنزيل على دفعات والا ينقطع هذا المد الجميل من الافكار رايكم شنو يا شباب؟

#22

ما هي افضل طريقة لعمل Check لجميع الCheckBoxes مثلا أريد ان اقوم بعمل فلترة لنتائج البحث (ذكور --- اناث) (طفل - شاب - مسن) (موظف - غير موظف) الخ...

#23
mallokbakkar1 كتب:

ما هي افضل طريقة لعمل Check لجميع الCheckBoxes مثلا أريد ان اقوم بعمل فلترة لنتائج البحث (ذكور --- اناث) (طفل - شاب - مسن) (موظف - غير موظف) الخ...

تحياتى

أفضل طريقة هى وضع الـ CheckBoxes داخل Container وليكن Panel ثم عمل Loop مثلاً باستخدام Foreach

بالتوفيق

1
#24

هناك خاصية مفيدة للفرز في حال تنوعت العناصر

وهي خاصية Tag كانت فيما مضى من النوع string أما الآن فهي من النوع Object

أي تتقبل أي كائن حتى لو كلاس خاص يحوي بيانات خاصة للفرز

حينها تستطيع أن توسم كل مجموعة عناصر بوسم فريد

كأن تعطي لعناصر CheckBox قيمة واحدة للتاج Tag مثلا "PersonType" ومن ثم تبحث في مجموعة العناصر للفورم المتوفر في الخاصية Controls من خلال تعليمة Foreach كما تفضل الأخ هاني

وتتحقق من الشرط فيما إذا كانت قيمة Tag لكل عنصر يمر يساوي القيمة السابقة

عندها تغير قيمة CheckBox و إلا فليتجاهل العنصر

القيمة سترينغ هي للتصنيف البسيط

ولكن بإمكانك أن تنشيء فئة Class تحتوي عدة خصائص

وتعطي لكل عنصر كائن جديد بقيم مختلفة للخصائص وتسندها لخاصية Tag للعنصر

وأثناء البحث تتحق من قيمة إحدى الخصائص الداخلية للتاج على اعتبارها أصبحت كائن

ومن هنا تستطيع أن تعطي تصنيفات مختلفة للعناصر

2

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

مواضيع مشابهة