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

كيفية عمل كنترول يستقبل داله ويعطي ناتجها شبيه بال fx في الاكسل

رائج
بدأه shmookh في 10 ديسمبر 2013 · 93 رد · 6,371 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#76

أخي الكريم,,

عملت الكود السابق بين try catch ,وكان يطلع لي نفس الخطاء (can not update,database or object is read only)..

هل المشكله في الsheet نفسها , لأنه من ضمن الtools الي معها أنها تفتح ورقه أكسيل لكن هذي الورقه (read only) ,فربما تكون أيضا ال sheet لها نفس الخاصيه.. :excl: :excl: :excl:

حاولت ابحث عن كيفية تغير هذه الخاصيه لكني لم أوفق..

#77

أخي الكريم..

بما أن الــ axspreadsheet ضمن البرنامج نفسه ,هل هناك داعي لإستخدام

 cn = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + axSpreadsheet1 + ";Extended Properties=Excel 8.0;");

________________________

في حال أن ماإفترضته صحيح,,

هذا يعني أنه بإمكاني أن استخدم دواره للتعامل مباشرة مع خلايا الsheet .

حاولت أن أجرب هذا الافتراض لكن أعتقد أن هناك مشكله في إسترجاع قيم الخلايا ,حاولت بأكثر من طريقه منها:

textBox1.Text = Convert.ToString(axSpreadsheet1.ActiveSheet.Cells[2, 2]);

لكن القيمه التي تظهر في ال textbox box هي:

 System.__ComObject

؟؟؟؟

#78

نعم بالضبط

هذا ما كنت أريد سؤالك عنه، فيما إذا كانت الـ Sheet ضمن مشروعنا أو صفحة خارجية؟

فالصفحة ضمن المشروع يمكن قراتها عن طريق API الخاصة بالأوفيس كما تحدثنا سابقاً ضمن مكتبة microsoft.office.interop.excel بالتالي لسنا بحاجة لإنشاء اتصال معها!

 

وألاحظ انك قمت بهذا، لكن ما سبب ظهور قيمة System.ComObject ضمن الـ TextBox  فهناك نقطة مهمة:

(" تقنيات ميكروسوفت تفرض الكثير من القيود وتحد من عمل المبرمج بسبب احتكارها لتقنياتها، فأنت مجبر على العمل حسب ما تملية علينا ميكروسوفت ! ")

 

العبارة axSpreadsheet1.ActiveSheet.Cells[2, 2]

تعبر عن خلية واحدة ضمن صفحة إكسيل. بالتالي تحويلها عن طريق ToString سيعطينا هرمية هذه الخلية ضمن تصميم نظام الإكسيل System.__ComOb، بينما نحن نريد قيمة هذه الخلية.

 

 

حسب ما لاحظت  ليست هذه هي الطريقة الصحيحة لقراءة البيانات من خلايا صحفة إكسيل، إليك الطريقة التالية:

 

1. نقوم بتعريف مجموعة الخلايا المطلوبة ( أو خلية واحدة) ضمن Range، مثلاً لنفرض أننا بحاجة للتعامل مع أول خلية بالصفحة والتي سيكون إسمها A1، فنحدد هذه الخلية بالشكل التالي:

 Microsoft.Office.Interop.Owc11.Range range = axSpreadsheet1.ActiveSheet.get_Range("A1");

2. المتغير range هو ما سيساعدنا في التعامل مع هذه الخلية عن طريق الميثود الموجود بداخله، مثلاً لو أردنا وضع القيمة 10.5 داخل هذه الخلية نقوم بالتالي:

range.set_Value(Type.Missing, 10.5);

أنتِ بحاجة للقيمة Type.Missing كون الخلية ممكن أن تأخذ أكثر من نوع من البيانات، Double, int, string....، لذلك نضع هذه القيمة، ونترك الإكسيل يحدد نوعها.

 

3. في حال أردنا قراءة قيمة الخلية نميز حالتين:

        a. عندما لا نعلم نوع البيانات ضمن الخلية لذلك النتيجة ستكون على شكل object كالتالي:

object value = range.get_Value();

        b. في حال كنا نعلم نوع البيانات ضمن الخلية، نقوم بعمل casting مباشر كالتالي:

double value = (double)range.get_Value();

4. في حال أردنا معرفة نوع البيانات ضمن الخلية نقوم بالتالي:

Type type = range.get_Value().GetType();

أسال الله أن ينفعك هذا.

 

 

بالتوفيق.

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#79

ملاحظة بخصوص {} try {} catch

 

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

تم تعديل هذه المشاركة بواسطة Eng.Tareq Jehad في 1 يناير 2014 في 20:03

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#80

أخي الكريم,

الميثود get_value  يطلع عندها خطأ.

انه لابد من ارسال parameters .

بس ماعرفت ايش المفروض اني ارسلها..

تم تعديل هذه المشاركة بواسطة هلا السروري في 2 يناير 2014 في 06:46

#81

جربي 

double value = (double)range.get_Value(Type.Missing);

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#82

أخي الكريم..

التعليمه من المفترض أن تقرأ قيمه خليه في ال sheet , لكن القيمه التي يتم تخزينها هي 0 دائما

// int value1 = Convert.ToInt32(range.get_Value(Type.Missing));

؟؟

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

#83

القيمه إذا أدخلتها أنا بإستخدام

range.set_Value

وقرأتها الى المتغير value تكون صحيحه (بمعنى هي نفسها التي أدخلتها أنا)

لكن إذا أدخلها المستخدم في الrun time ,القيمه التي يتم حفظها في المتغير value =0

تم تعديل هذه المشاركة بواسطة هلا السروري في 3 يناير 2014 في 18:57

#84

لا أعرف بالضبط سبب المشكلة عندك!!!

 

لكن عندي قمت بتجربة 10 أرقام ادخلتها ثم قمت بقراءتها ضمن Run Time وكانت النتائج صحيحة كالتالي:

f2P5TQb.png?1

 

كود القراءة كالتالي:

        private void button1_Click(object sender, EventArgs e)
        {
            string str = "";
            for (int i = 1; i <= 10; i++)
            {
                string cell = string.Format("A{0}", i); // Formating the Cell Name ex: A1
                Microsoft.Office.Interop.Owc11.Range range = axSpreadsheet1.ActiveSheet.get_Range(cell);

                double value = (double)range.get_Value(Type.Missing);
                str += value + "\n";
            }
            MessageBox.Show(str);
        }

فقط قمنا بالمرور على 10 عناصر ضمن الـ Sheet، لكن هناك ملاحظة عندما نقوم بكتابة قيمة معينة ضمن خلية معينة فإن الخلية لا تأخذ القيمة إلا في حال إلغاء تحديد هذه الخلية (Focus) كأن نضغط على خلية أخرى.

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#85

مشكوووووووووور أخي,

طلع السبب هو إلي قلته ,(إلغاء تحديد هذه الخلية)

#86

السلام عليكم أخي..
معي check list box يفترض بعد أن يختار المستخدم عنصر ويضغط على زر موافق يقوم بعمليه معينه..
لكن هناك بعض العناصر تحتاج معلومات إضافيه بمعنى (فرضا إذا ضغط على العنصر الفلاني قبل مايضغط زر موافق تظهر رساله انه لابد من إدخال قيمه إضافيه )
ماهو ال event المناسب حاولت أعمل الكود في الحدث SelectedIndexChanged,بس بدون أي فايده

 private void indicator_list_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (indicator_list.GetItemCheckState(1) == CheckState.Checked || indicator_list.GetItemCheckState(2) == CheckState.Checked || indicator_list.GetItemCheckState(3) == CheckState.Checked)
            {
                MessageBox.Show("فضلا قم بإدخال سنة الأساس");
                label4.Visible = true;
                comboBox1.Visible = true;
                label5.Visible = false;
                comboBox3.Visible = false;
            }
            else
                if (indicator_list.GetItemCheckState(4) == CheckState.Checked)
                {
                    MessageBox.Show("فضلا قم بإدخال عدد الأشهر القضائيه");
                    label5.Visible = true;
                    comboBox3.Visible = true;
                    label4.Visible = false;
                    comboBox1.Visible = false;
                }
                else
                {
                    label5.Visible = false;
                    comboBox3.Visible = false;
                    label4.Visible = false;
                    comboBox1.Visible = false;
                }
            
        }

تم تعديل هذه المشاركة بواسطة هلا السروري في 6 يناير 2014 في 23:05

#87

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

 

بالنسبة للعنصر CheckedListBox يوجد عدة أحداث للتعامل معها. مثل ItemCheck، ولكنه لا ينفذ بالوقت المطلوب، [ عند تغيير حالة الـ CheckBox مباشرة]. بل بعد الضغط على عنصر أخر. وهذا ليس المطلوب !!

 

لذلك سنقوم بإستخدام عنصر آخر [هذه المرة من صنعنا]، حيث سنستفيد من معرفتنا البرمجية، وستلاحظي سهولة العمل مع العنصر الجديد. [هناك مثال مرفق].

لكن أولا أريد أن أنبهك على أمر:

تسمى عمليه إظهار عناصر معينة واخفاءها حسب مرحلة البرنامج الحالية ب UI Interaction Logic، بالتالي هي مهمة جدا في توجيه المستخدم.

في مثالك عندما يكون لدينا مجموعة من العناصر مثل [label4, comboBox1] كمجموعة و [label5, comboBox3] كمجموعة أخرى، الأفضل جمع عناصر المجموعة ضمن Panel أو groupBox مثلاً, وبعدها نقوم بإظهار وإخفاء الـ Panel والتي ستخبر عناصر مجموعتها بإن يظهروا أنفسهم أو يخفوها. هكذا تقل نسبة الكود، وتزيد قوة البرنامج نوعا ماً.

 

لبناء عنصرنا الجديد يلزمنا

1. Panel لوضع الـ CheckBoxes عليها

2. يلزمنا مجموعة من الـ CheckBox نضيفها على الـ Panel  السابقة

3. نقوم بعمل مجموعات العناصر التي نريد إظهارها وإخفاءها حسب CheckBox  معين. ونرتبها ضمن Panel أو GroupBox كما قلنا.

4. نقوم بربط حالة ChecBox محدد مع مجموعة  العناصر المراد اظهارها، في حال تحديد هذا الـ CheckBox يتم إظهار المجموعة.

 

ربما تجدي الكلام طويل، أو أن التطبيق صعب. لكن على العكس الآمر بغاية السهولة.

مثلا لو فرضنا لدينا groupBox1 يحوي على عنصر لإدخال التاريخ وأن checkBox1 هو المسؤل عن إظهار الـ groupBox. كل ما علينا فعله هو كتابة  الجملة التالية ضمن حدث CheckBox_CheckedChanged

 

groupBox1.Visible = checkBox1.Checked;

 

هذه صورة عن المثال، جربيه وفي حال أي سؤال أخبريني.

 

ar0mNog.png?1

 

... All the best

CheckBoxList.rar

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#88

شكرا أخي الكريم..

جاري الإطلاع ..

#89

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

أريد أن يتم حفظ  أو(نقل) ملف إلى مجلد معين ,الملف يقوم المستخدم بإختياره ,,

حاولت بإستخدام هذا الكود

OpenFileDialog op = new OpenFileDialog();
            if (op.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                pa = op.FileName;
          
              
            }

            System.IO.File.Move(pa, @"C:\Users\Norhan\Desktop\S3JC\"+ );

لكني واجهت مشكلة بأن الملف المحفوظ لا يتم التعرف عليه بمعنى ينحفظ الملف ولكن بإمتداد غير إمتداد الملف الأصلي..

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

إلا إذا كان نوع المتغير pa هو path.

جربت أستخدمها ولكن من دون جدوى..

تم تعديل هذه المشاركة بواسطة هلا السروري في 7 يناير 2014 في 21:06

#90

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

 

ضمن الـ OpenFileDialog هناك خاصيتين مهمتان:

1. FileName والتي تعطينا مسار الملف كامل

2. SafeFileName تعطينا فقط إسم الملف وإمتداده.

 

الميثود Move تحتاج لمسار الملف المراد نقله, وللمسار الجديد، المثال التالي يقوم بنقل الملف بالإمتداد الصحيح.

            OpenFileDialog op = new OpenFileDialog();
            if (op.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                System.IO.File.Move(op.FileName, @"C:\Users\Norhan\Desktop\S3JC\" + op.SafeFileName);
            }

ملاحظة: أحيانا لا يملك البرنامج صلاحيات معينة للتعامل مع الملفات، خصوصاً إذا كان التعامل مع القرص C

في مثل هذه الحالة نقوم بتشغيل البرنامج [Visual Studio] كـَ Administrator، عندما نقوم بالضغط على أي برنامج بالزر الأيمن تظهر قائمة فيها خيار Run As Administrator وهي تعطي صلاحيات واسعة للبرنامج.

 

بالتوفيق...

تم تعديل هذه المشاركة بواسطة Eng.Tareq Jehad في 7 يناير 2014 في 21:55

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#91

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

 1-بشأن موضوع الــ UI Interaction Logic

      عملت الي قلت لي عليه,لكن مارضى يشتغل..

       بمعنى عندما كنت اختار checkbox معينه والتي يفترض ان يظهر مع الضغط عليها الpanal ,كان حالة الpanal لا تتغير,,

       غيرت في الحدثCheckBox_CheckedChanged الى CheckBox_CheckedChanged,ولكن من دون أي فائده..

 

2- هناك بعض ال controls لها أزرار مبرمجه جاهزه ,مثلا الكريستال ريبورت فيه زر طباعه وحفظ ..الخ ,هل أستطيع أن أعدل على كود هذه الأزرار وإن كان ,كيف اصل الى هذه الأكودا؟؟؟

 

مشكووور مقدما..

#92

أختي الكريمة

المثال واضح وسهل جدا

انت جربتي المشروع المرفق؟

لأني قمت بربط جيمع الـ CheckBox على نفس الحدث، بإمكانك عمل حدث لكل واحد على حدة.

 

هناك الكثير والكثير من controls الجاهزة، عبارة عن dll تقومي بإضافتها إلى ToolBox وتصبح جاهزة في اي وقت

تم تعديل هذه المشاركة بواسطة Eng.Tareq Jehad في 9 يناير 2014 في 03:12

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#93

نعم جربته..

وهذا الي محيرني ..أنه مافيه أي إختلاف ,,لكن سأحاول مره أخرى..

#94

حاولي مرة اخرى.

واذا لم ينفع الأمر. اخبريني حتى اعطيك كنترول بسيط مشابه. تضيفه لمشروعك.

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…