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

مشكلة في التعامل مع الحدث datagridview_editingcontrolshowing

بدأه بهاء صلاح الدين في 26 أبريل 2010 · 5 رد · 684 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته ....لدي داتا جريد بها مجموعة حقول من ضمنها حقلين من النوع كومبوبوكس. الكومبو الأول يأتي بأسماء المدن و عند إختيار مدينة ما يتم ملء الكومبو الثاني بفنادق هذه المدينة ....قمت بوضع هذا الكود من أجل هذه العملية ...

private void dataGridrooms_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            try
            {

if(col_index ==2)
                {                    
                    grid_combo = (ComboBox)e.Control;
                    grid_combo.DataSource = null;
                    comb.combo_bounding(grid_combo, "select id,name from hotels where saudi_city_id=" + (int)dataGridrooms.Rows[row_index].Cells["cities"].Value + "", "hotels", CommandType.Text);
                    grid_combo.SelectedIndexChanged -= new EventHandler(grid_combo_SelectedIndexChanged);
                    grid_combo.SelectedIndexChanged += new EventHandler(grid_combo_SelectedIndexChanged);               	
           	}    

}
            catch
            {

            }
        }

كما نلاحظ أنني قد أستخدمت الحدث EditingControlShowing ، حيث يتم فحص الكنترول الموجودة في العمود عن طريق هذا الكود:grid_combo = (ComboBox)e.Control;، فإذا كانت الكومبو الثانية يتم ملئها عن طريق الكود أعلاه...المشكلة أنني بعد أن أختار الفندق من الكومبو الثانية فإن شكل القلم الذي يدل على أن الداتاجريد ما زالت في وضع تعديل البيانات لا يزال موجودا"، و هذا لا يجعلني انتقل إلى أي خلية أخرى داخل الداتاجريد و لا حتى أي كنترول في الفورمة، بل لا أستطيع إغلاق الفورم!!! .

أستنتجت و ربما يكون إستنتاجي صحيحا" أن حدث EditingControlShowing لا يزال مفعلا" و يمنع أي حدث آخر من الإنطلاق ...لذا جربت وضع هذا الكود لعله ينهي الحدث و لكنه لم يفعل :

void grid_combo_SelectedIndexChanged(object sender, EventArgs e)
        {
            dataGridrooms.Rows[row_index].Cells["hotel"].Value = grid_combo.SelectedValue;
            DataGridViewCellEventArgs vv= new DataGridViewCellEventArgs(col_index, row_index);
            dataGridrooms_CellEndEdit(dataGridrooms ,vv );
        }

private void dataGridrooms_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            dataGridrooms.EndEdit();
        }

قمت بعمل breakpoint لتتبع الكود فوجدت ان البرنامج لا يذهب مطلقا" للحدث CellEndEdit ...و وضعت هذا السطر dataGridrooms.EndEdit(); في أماكن مختلفة فلم يفلح الأمر ...

ما هي آرائكم لإنهاء هذا الحدث الملعون EditingControlShowing ؟

تم تعديل هذه المشاركة بواسطة بهاء صلاح الدين فراج في 26 أبريل 2010 في 21:37

#2

طيب اعمل Rebuild للبرنامج و جرب

#3

عملت rebuild و لم يحدث شئ

#4

رجاء قم بضبط جملة ال sql اولا في هذا السطر:

comb.combo_bounding(grid_combo, "select id,name from hotels where saudi_city_id=" + (int)dataGridrooms.Rows[row_index].Cells["cities"].Value + "", "hotels", CommandType.Text);

لتكون

comb.combo_bounding(grid_combo, "select id,name from hotels where saudi_city_id='" + (int)dataGridrooms.Rows[row_index].Cells["cities"].Value + "'", "hotels", CommandType.Text);

ثم جرب مرة ثانية و اخبرنا بالنتيجة

و بالمناسبة

ما نوع حقل ال id في كومبو الفنادق ؟؟؟

و هل يتم ملءه يدويا و لا بيعمل bind علي داتا سورس؟

[يمين]في زمان كل شئ فيه يتحرك بسرعة ... كونك ثابتا يعني انك تتحرك للوراء...

[/يمين]

#5

أول ما لفت نظري في الكود هو :

            catch
            {

            }

لماذا تتبع الخطأ ثم تخفيه ؟ , هنالك خطأ ما يحدث داخل جملة try catch لكنك لا تعرف ماهو لأن جملة catch تقوم بتجاهله و إخفاء رسالة الخطأ من المترجم ,

أزل جملة try catch لتظهر لك رسالة الخطأ وتعرف كيف تعالجه , أو أكتب الجملة بطريقة صحيحة :

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

أما catch بدون إظهار رسالة خطأ , فكأنك تبرمج وأنت مغمض العينين

وستحدث معك أشياء غريبة جداً طالما تستخدم catch ناقصة , لأنك تخبر المترجم بإخفاء أي خطأ , وسترى فقط نتائج الخطأ دون أن تعرف أنه حدث أو ما سببه

..

#6

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

انتهت المشكلة و الحمد لله. تخليت تماما" عن الحدث EditingControlShowing و و ضعت هذا الكود في الحدث CellEndEdit:

if (e.ColumnIndex == cities.Index)
                {
                    for (int i = 0; i < dataGridrooms.Rows.Count; i++)
                    {
                        DataGridViewComboBoxCell hotel_combo = (DataGridViewComboBoxCell)dataGridrooms["hotel", i];
                        hotel_combo.DataSource = null;
                        dg_methods.combocell_bounding(hotel_combo, "select id,name from hotels where saudi_city_id=" + (int)dataGridrooms.Rows.Cells["cities"].Value + "", "hotels", CommandType.Text);

                    }
                }

كما تلاحظون انه يتم ملء كومبو الفنادق بعد الانتهاء من تحرير كومبو المدن، و المقصود هنا بتحرير الكومبو أي إختيار مدينة.

و لكن ستظهر مشكلة اخرى تدل على حتمية إسراع ميكروسوفت في تطوير أداة الداتا جريد، فإذا كانت لديك عدة صفوف في الداتا جريد و تريد مثلا" إدراج هذه الصفوف في قاعدة البيانات فسيظهر خطأ لأن البرنامج لن يأخذ قيمة ID الموجودة في الكومبو و لكن سيأخذ القيمة النصية ما لم تقم بالإختيار من الكومبو، يعني بدلا" من إدخال القيمة 2 فإنه سيدخل "فندق شيراتون مكة" .... ما الحل إذا"؟

يمكنك إستخدام هذ الكود :

for (int i = 0; i < dataGridrooms.Rows.Count; i++)
                        {
                            DataGridViewComboBoxCell hotel_combo = (DataGridViewComboBoxCell)dataGridrooms["hotel",i];
                            room_update.CommandType = CommandType.StoredProcedure;   
                            if (hotel_combo.Value.GetType().ToString() == "System.String")
                            {
                                room_update.Parameters.Add("@hotel_id", SqlDbType.Int).Value = (int)dataGridrooms.Rows.Cells["hotel_id"].Value;
                            }
                            else
                            {
                                room_update.Parameters.Add("@hotel_id", SqlDbType.Int).Value = (int)dataGridrooms.Rows.Cells["hotel"].Value;
                            }

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

و هذا حلي المتواضع لهذه المشكلة التي قد تواجهكم...

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