PDA

View Full Version : آموزش: فرم انتظار



fmehrvarzi
یک شنبه 29 دی 1392, 15:00 عصر
http://s5.picofile.com/file/8110131076/WaitingFormForNewForm.gif


http://s5.picofile.com/file/8109937792/Loading_In_Form.gif


http://s5.picofile.com/file/8110130026/SplashScreen.gif


نسخه 4.1(Ed41) (سورس کد و لایبراری ضمیمه شده اند):
این لودینگ واقعی است! یعنی یک زمان ثابت برای لودش نمیدهم بلکه براساس مدت زمان واقعی مورد نیاز برای لودش منتظر می ماند!

قابلیتها:

1-دارای قابلیت ارسال فرم ، ارسال شی و ارسال آرایه ای از اشیا و یا همزمان باهم که در overload های تابع CreateForm همگی قرار داده شده اند.
2-در این نسخه کد نویسی تا حد ممکن تمیز شده و نام گذاری ها به تناسب کارشان اصلاح شده اند و مستند سازی شدند.
3-دارای قابلیت نمایش Splash Screen همراه با خاصیت TextSplash که می توان متن فرم Splash را تعیین کرد.
4- دارای خاصیتی به نام Text که می توان متن فرم انتظار را تعیین کرد.
5- دارای قابلیتی برای نمایش فرم انتظار برای محاسبات زمانگیر داخل فرم به دو صورت(InForm)

در این نسخه 4.1 قابلت ارسال آبجکت بازگشتی به تابع غیر استاتیک CreateInForm اضافه شد و راهنما به روزرسانی شد.
استفاده از این لایبراری که ضمیمه شده برنامه ی شما را حرفه ای جلوه میدهد.(کدها توسط اینجانب نوشته شده است و با سورس باز که در پروژ دمو قرار دارد)
(خوشتان آمد لایک یادتون نره:تشویق:)

برای استفاده از این لایبراری آنرا از طریق زیر به پروژه تان اضافه کنید

Solution Explorer>References>Add Reference>Browse>WaitingForHeavyForm.dll

هدف ساخت:
ساختن یک فرمی که به کاربر نشان دهد که برای دیدن آن فرم سنگین منتظر بماند.

ضرورت ساخت:
اگر فرم شما خیلی سنگین باشد مثلاً برای لود کردن تصویر ذخیره شده از درون دیتابیس برنامه قدری مکث میکند و کاربر احساس میکند که برنامه هنگ کرده و یا اگر از کریستال ریپورت استفاده میکنید کاربر احساس میکنه که برنامه هنگ کرده(که من از این قسمتش استفاده کردم)
و یا اگر از اینترنت استفاده میکنید ممکن است کاربر احساس کند که برنامه هنگ کرده و یا هر چیزی که زمان بر است...

کامپوننت مورد استفاده:
برای ساخت این لایبراری از BackGroundWorker (کامپوننت مولتی تردینگ)استفاده شده است.

نیازمندی ها:
دات نت فریمورک 3.5

-----------------------------------
آموزش نحوه استفاده از کدها:
-----------------------------------

-------------------------------------------------------
1--نمایش فرم انتظار برای باز شدن یک فرم جدید
-------------------------------------------------------


http://s5.picofile.com/file/8110131076/WaitingFormForNewForm.gif

فرض کنید یک MainForm و چندین ChildForm داریم:
این کد را برای نمایش ChildForm در MainForm (به جای استفاده از Show()) به کار میبریم:

//add this name space
using LoadingForm;

// In Your MainForm
Waiting.CreateForm(typeof(ChildForm1));

و این کد را در ChildForm بعد از پروسه زمان برتان و قبل از لود به کار می بریم:

LoadingForm.Waiting.ReportCompleted();

یعنی به این صورت
public partial class ChildForm1 : Form
{
public ChildForm1()
{
InitializeComponent();
//فرضاً پروسه زمان برتان اینجا قرار دارد که قبل از لود باشد

LoadingForm.Waiting.ReportCompleted();
}
}
در این نسخه Waiting.CreateForm دارای 5 نسخ متفاوت overload برای ایجاد یک فرم جدید با قابلیت انتقال هر تعداد و هر نوع شی می باشد و در فایل ضمیمه به صورت عملی بکار برده شده است و از توضیح آن در اینجا خوداری شده است.

-------------------------------------------------------
2--نمایش فرم انتظار برای انجام عملی زمانبر در داخل فرم اصلی توسط متد غیر استاتیک CreateInForm
-------------------------------------------------------


http://s5.picofile.com/file/8110163642/WaitingFormWithoutEnforce.gif

(این مثال در سورس ضمیمه پیاده سازی شده است)
فرض کنید یک پروسه زمان بر در یک قسمت از کدتان به صورت زیر قرار دارد (که در آن MainForm همان فرمی است که باتن 6 قرار دارد)

http://s5.picofile.com/file/8110162542/WaitingInForm1.png
برای استفاده از این متد ابتدا باید یک شی از کلاس Waiting تهیه کرد:
LoadingForm.Waiting wt2 = new LoadingForm.Waiting();
و سپس کدهای قسمت قبل را به این صورت درآورید:


http://s5.picofile.com/file/8110163176/WaitingInForm2.png
private void button6_Click(object sender, EventArgs e)
{
wt2.TextWaiting = "صبر کنید";
wt2.CreateInForm(typeof(MainForm), this, false, false, "DoWork2");
}

public void DoWork2()//این متد در یک نخ دیگر در حال اجراست
{
//Simulate Heavy Processing
System.Threading.Thread.Sleep(4000);
}
تذکر1: هرگز از اشیاء فرمتان(در واقع هر شی که خارج از این متد DoWork تعریف شده باشد )
در این متد DoWork استفاده نکنید، که با خطا مواجه میشوید(چون این متد در یک نخ (Thread)دیگر در حال اجراست)
بهتر است از متد با قابلیت بازگشت شی DoWork که ساختارش در ** ارائه شده است استفاده کرد.

تذکر2: هرگز اشیاء این فرمتان را در این متد DoWork مودیفای (تعیین ) نکنید
یعنی بهشون مقدار ندهید ولی میتوانید آنهارا به صورت زیر در این متد DoWork فراخوانی کنید:
Form1 thisForm=LoadingForm.Waiting.formMain as Form1;
string _str = thisForm.textBox1.Text;
در صورت نیاز برای فراخوانی (و نه مودیفای) اشیاء فرم اصلی در همین تابع DoWork از این کد استفاده کنید.

تذکر3: نام گذاری تابع مهم نیست که چی باشه فقط هرچی که هست همان نام را در تابع CreatInForm قرار دهید.


**: متد MyDoWork1 (البته نام گذاریش مهم نیست) با قابلیت ارسال شی:

http://s5.picofile.com/file/8110499450/Send_Object.png
private void button6_Click(object sender, EventArgs e)
{
wt2.TextWaiting = "صبر کنید";
object obj=wt2.CreateInForm(typeof(MainForm), this, false, false, "MyDoWork1");
}

public object MyDoWork1()//این متد در یک نخ دیگر در حال اجراست
{
//Simulate Heavy Processing
System.Threading.Thread.Sleep(4000);
}

-------------------------------------------------------
3--نمایش Splash Screen برای ورود به نرم افزار
-------------------------------------------------------


http://s5.picofile.com/file/8110130026/SplashScreen.gif

فرض کنید فرمی داریم که دارای لود سنگین می باشد و کدهای فرمش به این صورت می باشد:

http://s5.picofile.com/file/8110167350/SplashCode1.png
برای نمایش فرم splash کدها را به این صورت در آورید:

http://s5.picofile.com/file/8110168392/SplashCode2.png
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
LoadingForm.Waiting wt=new LoadingForm.Waiting();
private void Form1_Load(object sender, EventArgs e)
{
wt.TextWaiting = "در حال ورود به سیستم...";
wt.CreateInForm(typeof(Form1), this, true, false, "DoWorkInForm");
}
public void DoWorkInForm()//این متد در یک نخ دیگر در حال اجراست
{
// Simulate Heavy Loading
System.Threading.Thread.Sleep(3000);
}
}


فراموش نشود: در صورتی که از این(و یا هر تغییری از این) کدها در پروژه تان استفاده کردید در قسمت تشکرات برنامه تان تشکر از "فرهاد مهرورزی" فراموش نشود.

توجه: فایل های ضمیمه با ویژوال استودیو 2012 نوشته شده اند برای باز کردن فایلها در نسخه 2010 ویژوال استودیو فایل .sln (سولوشن) را با نوت پد باز کنید و سپس این خط را
Microsoft Visual Studio Solution File, Format Version 12.00

را به این خط تبدیل کنید
Microsoft Visual Studio Solution File, Format Version 11.00



فایلهای ضمیمه شده برای نسخه 4.1:
لایبراری: WaitingForHeavyForm_Ed41.zip
سورس پروژه همراه با دمو: UC_LoadingForm_Ed41.zip

reza1699
یک شنبه 29 دی 1392, 17:25 عصر
http://s5.picofile.com/file/8109712826/LoadingForm.gif

استفاده از این لایبراری که ضمیمه شده برنامه ی شما را حرفه ای جلوه میدهد.(کدها توسط اینجانب نوشته شده است و با سورس باز که در پروژ دمو قرار دارد)
(خوشتان آمد لایک یادتون نره:تشویق:)

برای استفاده از این لایبراری آنرا از طریق زیر به پروژه تان اضافه کنید

Solution Explorer>References>Add Reference>Browse>WaitingForHeavyForm.dll

هدف ساخت:
ساختن یک فرمی که به کاربر نشان دهد که برای دیدن آن فرم سنگین منتظر بماند.
این لودینگ واقعی است! یعنی یک زمان ثابت برای لودش نمیدهم بلکه براساس مدت زمان واقعی مورد نیاز برای لودش منتظر می ماند!

ضرورت ساخت:
اگر فرم شما خیلی سنگین باشد مثلاً برای لود کردن تصویر ذخیره شده از درون دیتابیس برنامه قدری مکث میکند و کاربر احساس میکند که برنامه هنگ کرده
و یا اگر از کریستال ریپورت استفاده میکنید کاربر احساس میکنه که برنامه هنگ کرده(که من از این قسمتش استفاده کردم)
و یا اگر از اینترنت استفاده میکنید ممکن است کاربر احساس کند که برنامه هنگ کرده

کامپوننت مورد استفاده:
برای ساخت این لایبراری از BackGroundWorker (کامپوننت مولتی تردینگ)استفاده شده است.

نیازمندی ها:
دات نت فریمورک 3.5

نحوه استفاده از کدها:(یک پروژه دمو ضمیمه شده است)

فرض کنید یک MainForm و چندین ChildForm داریم:
این کد را برای نمایش ChildForm در MainForm (به جای استفاده از Show()) به کار میبریم:

// In Your MainForm
Waiting.CreateForm(typeof(ChildForm1));

و این کد را در ChildForm بعد از پروسه زمان برتان و قبل از لود به کار می بریم:

WaitingForHeavyForm.Waiting.ReportCompleted();

یعنی به این صورت
public partial class ChildForm1 : Form
{
public ChildForm1()
{
InitializeComponent();
//فرضاً پروسه زمان برتان اینجا قرار دارد که قبل از لود باشد

WaitingForHeavyForm.Waiting.ReportCompleted();
}
فراموش نشود: در صورتی که از این(و یا هر تغییری از این) کدها در پروژه تان استفاده کردید در قسمت تشکرات برنامه تان تشکر از "فرهاد مهرورزی" فراموش نشود.
فایلهای ضمیمه شده:
لایبراری: WaitingForHeavyForm.zip
پروژ دمو: UC_LoadingForm.zip

این پروژه مثال رو با چه نسخه ای نوشتید؟
2012؟
یا 2013؟

fmehrvarzi
یک شنبه 29 دی 1392, 17:41 عصر
این پروژه مثال رو با چه نسخه ای نوشتید؟
2012؟
یا 2013؟

با 2012 نوشتم

reza1699
یک شنبه 29 دی 1392, 18:39 عصر
با 2012 نوشتم
دست شما درد نکنه !
الان من ولی 2012 رو در اختیار ندارم !
یه مسئله ای ! از کدهایی که نوشتید من استفاده کردم ! ولی مسئله اینه که دستور واکشی من توی همون فرم اصلی انجام میشه ! یعنی وقتی کلید گزارش رو میزنی ، واکشی رو انجام میده و بعد دیتا تیبل رو به فرم ریپورت ارسال میکنه !
حالا برای این شرایط چطور میتونم استفاده کنم ازش؟ ضمنا باید حتما برای فرم ریپورتم که متغییر ارسال کنم ! تا متوجه بشه باید دیتاتیبل رو به کدوم ریپورت پاس بده !

reza1699
یک شنبه 29 دی 1392, 19:11 عصر
آقا این اگه بخوایم یه متغییر رو ارسال کنیم از مثلا فرم 1 به فرم 2 ! جواب نمیده و لودینگ همینجوری باقی میمونه !
و اگه هم نشه ارسال کرد ! که دیگه ... ! این مشکل بزرگیه !

اگه بشه یه کاری کرد که به جای اینکه اونجا اسم فرم رو بنویسیم ، اسم یک شیء از نوع اون فرم رو بنویسیم فکر میکنم بهتر باشه !

یه همچین چیزی :
Form2 form = new Form2(2);
Waiting.CreateForm(form));

fmehrvarzi
یک شنبه 29 دی 1392, 20:19 عصر
آقا این اگه بخوایم یه متغییر رو ارسال کنیم از مثلا فرم 1 به فرم 2 ! جواب نمیده و لودینگ همینجوری باقی میمونه !
و اگه هم نشه ارسال کرد ! که دیگه ... ! این مشکل بزرگیه !

اگه بشه یه کاری کرد که به جای اینکه اونجا اسم فرم رو بنویسیم ، اسم یک شیء از نوع اون فرم رو بنویسیم فکر میکنم بهتر باشه !

یه همچین چیزی :
Form2 form = new Form2(2);
Waiting.CreateForm(form));

باشه تو نسخه های بعدی قابلیت ارسال شی به فرم اضافه میکنم.
و همین طور قابلیت کنسل و پر شدن پروگرس بار به فرم انتظار اضافه کنم که اگر اوکی شد اون قابلیت بالا را هم که گفتین بهش اضافه میکنم
با تشکر از شما

reza1699
یک شنبه 29 دی 1392, 21:40 عصر
باشه تو نسخه های بعدی قابلیت ارسال شی به فرم اضافه میکنم.
و همین طور قابلیت کنسل و پر شدن پروگرس بار به فرم انتظار اضافه کنم که اگر اوکی شد اون قابلیت بالا را هم که گفتین بهش اضافه میکنم
با تشکر از شما

واقعا لطف میکنید !
ازتون خیلی ممنونم !
در واقع به نظرم اگر امکان ارسال رو داشته باشه ، واقعا یک چیز عالی میشه ! ولی اگر نداشته باشه ، میشه گفت یه طورایی بدون استفاده خواهد بود ! چون شما حتی اگه بخواهی گزارشی رو بگیری ، باید یک کد یا یک عدد یا یک رشته یا یک مورد خاص رو بفرستی برای فرم گزارشت تا در فرم گزارش مثلا عملیات واکشی بر اساس اطلاعات دریافتی صورت بگیره !
ولی الان نمیشه این کار رو کرد !
ممنون میشم ازتون اگر اینکار رو برای من انجام بدید ! و سایر دوستان البته !

یه سوال دیگه...
آیا امکان داره که این رو بشه طوری تنظیم کرد که عملیات لودینگ درون همون فرم جاری انجام بشه ! یعنی فرض کنید که اصلا فرم جدیدی نداریم...و میخوایم اول واکشی رو در فرم جاری انجام بدیم و بعد از اینکه انجام شده بفرستیم برای فرم گزارش ! اگر بشه اینکار رو انجام داد ، دیگه نیازی به اضافه کردن امکان ارسال شی هم نیست ! چون عملیات واکشی در همون فرم جاری با نشان دادن لودینگ انجام میشه و بعد ریخته میشه توی دیتاتیبل و بعد لودینگ قطع میشه و بعد دیتاتیبل آماده ارسال میشه به فرم کریستال ریپورت بدون هیچ مکثی !

fmehrvarzi
دوشنبه 30 دی 1392, 15:49 عصر
در واقع به نظرم اگر امکان ارسال رو داشته باشه ، واقعا یک چیز عالی میشه ! ولی اگر نداشته باشه ، میشه گفت یه طورایی بدون استفاده خواهد بود ! چون شما حتی اگه بخواهی گزارشی رو بگیری ، باید یک کد یا یک عدد یا یک رشته یا یک مورد خاص رو بفرستی برای فرم گزارشت تا در فرم گزارش مثلا عملیات واکشی بر اساس اطلاعات دریافتی صورت بگیره !
دوست عزیز نسخه 2 دارای قابلیت ارسال انواع مختلف شی با تعداد نامحدود است.
با تشکر

reza1699
دوشنبه 30 دی 1392, 19:03 عصر
سلام ! بازم از زحماتتون متشکر
مشکل من الان این هست : چون من توی این پروژه خیلی متغییر ها رو از طریق فرم به فرم ارسال میکنم ، این خیلی ضرورت داره که ارسال متغییر ها درست انجام بشه از طریق معمولش !
من یک نمونه کوچیک براتون میزارم که منظورم رو متوجه بشید :

اگر این کد فرم فرعی باشه :
public partial class Form2 : Form
{

public Form2(int x)
{
InitializeComponent();
}

private void Form2_Load(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(2000);
LoadingForm.Waiting.ReportCompleted();
}
}

و این کد فرم اصلی باشه

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


private void buttonX1_Click(object sender, EventArgs e)
{
Form2 form = new Form2(2);
Waiting.CreateForm(typeof(Form2), form);
}
}

در این حالت لودینگ گیر میکنه و اصلا نمیاد ! در واقع علتش هم اینه که اون ایکس به فرم فرعی داده نمیشه ! میخوام یه کاری کنید که بتونم اون ایکس رو پر کنم ! به همین صورت معمولش !
والا من زیاد حرفه ای نیست ! البته ارسال اطلاعاتتون درست انجام میشد ها ! یعنی تونستم رشته و ... منتقل کنم ! ولی اگه بخوام این کارو کنم ، خیلی کارم سخت میشه ! چون توی پروژه خیلی موارد هستن که باید ارسال بشن ، اونم از انواع مختلف !
اگه بشه دیگه اتوماتیک مثل form.show عمل کنه ، خیلی خوب میشه !

fmehrvarzi
دوشنبه 30 دی 1392, 19:07 عصر
دوستانی که دانلود کردید و نظری ندادید:
نظر، پیشنهاد، فراموش نشه
برای بهبود این لایبراری از نظرات شما استقبال میکنم.

fmehrvarzi
دوشنبه 30 دی 1392, 19:49 عصر
سلام ! بازم از زحماتتون متشکر
مشکل من الان این هست : چون من توی این پروژه خیلی متغییر ها رو از طریق فرم به فرم ارسال میکنم ، این خیلی ضرورت داره که ارسال متغییر ها درست انجام بشه از طریق معمولش !
من یک نمونه کوچیک براتون میزارم که منظورم رو متوجه بشید :

اگر این کد فرم فرعی باشه :
public partial class Form2 : Form
{

public Form2(int x)
{
InitializeComponent();
}

private void Form2_Load(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(2000);
LoadingForm.Waiting.ReportCompleted();
}
}

و این کد فرم اصلی باشه

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


private void buttonX1_Click(object sender, EventArgs e)
{
Form2 form = new Form2(2);
Waiting.CreateForm(typeof(Form2), form);
}
}

در این حالت لودینگ گیر میکنه و اصلا نمیاد ! در واقع علتش هم اینه که اون ایکس به فرم فرعی داده نمیشه ! میخوام یه کاری کنید که بتونم اون ایکس رو پر کنم ! به همین صورت معمولش !
والا من زیاد حرفه ای نیست ! البته ارسال اطلاعاتتون درست انجام میشد ها ! یعنی تونستم رشته و ... منتقل کنم ! ولی اگه بخوام این کارو کنم ، خیلی کارم سخت میشه ! چون توی پروژه خیلی موارد هستن که باید ارسال بشن ، اونم از انواع مختلف !
اگه بشه دیگه اتوماتیک مثل form.show عمل کنه ، خیلی خوب میشه !

----------------------------------------------:لبخند:
//Form Child
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

private void Form2_Load(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(2000);
int x=LoadingForm.Waiting.objMain as int;
MessageBox.Show(x.ToString());
LoadingForm.Waiting.ReportCompleted();
}
}

//Form Main
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


private void buttonX1_Click(object sender, EventArgs e)
{
//Form2 form = new Form2(2);
object objInt=2;
Waiting.CreateForm(typeof(Form2), objInt);
}
}

reza1699
دوشنبه 30 دی 1392, 21:30 عصر
----------------------------------------------:لبخند:
//Form Child
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

private void Form2_Load(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(2000);
int x=LoadingForm.Waiting.objMain as int;
MessageBox.Show(x.ToString());
LoadingForm.Waiting.ReportCompleted();
}
}

//Form Main
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


private void buttonX1_Click(object sender, EventArgs e)
{
//Form2 form = new Form2(2);
object objInt=2;
Waiting.CreateForm(typeof(Form2), objInt);
}
}

بله ! البته میدونستم این موضوع رو !
مسئله این بود که برای اینکار باید کلی تغییرات ایجاد کنم که احتمالا قاطی پاطی کنم توی فرم هام...بس که متغییر دارم ! چون تعدادشون زیاده !

fmehrvarzi
دوشنبه 30 دی 1392, 22:09 عصر
نسخه 3 اضافه شد و نسخه های قبلی پاک شدند
لطفاً بعد از دانلود نظر و پیشنهاد فراموش نشود.
با تشکر

fmehrvarzi
دوشنبه 30 دی 1392, 22:12 عصر
بله ! البته میدونستم این موضوع رو !
مسئله این بود که برای اینکار باید کلی تغییرات ایجاد کنم که احتمالا قاطی پاطی کنم توی فرم هام...بس که متغییر دارم ! چون تعدادشون زیاده !
به نظرم یک بک آپ بگیر و بعد بنشین عمل جراحی روی فرمت انجام بده :لبخند:

reza1699
سه شنبه 01 بهمن 1392, 18:30 عصر
به نظرم یک بک آپ بگیر و بعد بنشین عمل جراحی روی فرمت انجام بده :لبخند:

آقا یه پیشنهاد دیگه برای تکیل شدن این پروژه !
یه کاری کنی که لودینگ بدون باز شدن یه پنجره جدید هم کار کنه ! مثلا با زدن یک کلید ، باید یه چیزی لود بشه !
حالا این اومدن پنجره لودینگ با زدن دکمه مثلا شروع بشه و بعد از اینکه عملیات لود انجام شد ، پایان ! یعنی هیچ فرم جدیدی در کار نیست ! فقط در همون فرم جاری عملیات لود انجام میشه !

ببخشید ! من الان متوجه شدم که انگار چنین چیزی اضافه کردی... :)

reza1699
سه شنبه 01 بهمن 1392, 20:30 عصر
میشه در خصوص این کد زیر منو راهنمایی کنید؟
من میخوام رویداد فرم لود رو براش لودینگ بزارم !
چیکار باید بکنم؟ببینید این کاری که کردم درسته؟


private void Search_Recive_Load(object sender, EventArgs e)
{
Waiting.CreateWaitingForm(typeof(Search_Recive), this);

cnn = new SqlConnection(cstr);
try
{
cnn.Open();
}
catch (SqlException Err)
{
MessageBox.Show("ارتباط با بانک اطلاعاتی برقرار نیست.در صورت وجود مشکل با مدیر پروژه تماس بگیرید", "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

System.Globalization.CultureInfo inp = new System.Globalization.CultureInfo("fa-ir");
InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(inp);

sql1 = "select no,date_no,sr_name,attach,archive,follow,details,a ct from letters where s_r=0 order by no";
da = new SqlDataAdapter(sql1, cnn);
dt = new DataTable();

da.Fill(dt);
dataGridViewX1.DataSource = dt;

dataGridViewX1.Columns[0].HeaderText = "شماره";
dataGridViewX1.Columns[1].HeaderText = "تاریخ صدور";
dataGridViewX1.Columns[2].HeaderText = "فرستنده";
dataGridViewX1.Columns[3].HeaderText = "پیوست";
dataGridViewX1.Columns[4].HeaderText = "بایگانی";
dataGridViewX1.Columns[5].HeaderText = "پیگیری";
dataGridViewX1.Columns[6].HeaderText = "موضوع";
dataGridViewX1.Columns[7].HeaderText = "دستور یا ارجاع";
dataGridViewX1.Columns[0].Width = 50;
dataGridViewX1.Columns[1].Width = 70;
dataGridViewX1.Columns[2].Width = 200;
dataGridViewX1.Columns[3].Width = 50;
dataGridViewX1.Columns[4].Width = 100;
dataGridViewX1.Columns[5].Width = 50;
dataGridViewX1.Columns[6].Width = 200;
dataGridViewX1.Columns[7].Width = 195;
dataGridViewX1.ColumnHeadersDefaultCellStyle.Font = new Font("tahoma", 8);
dataGridViewX1.ColumnHeadersDefaultCellStyle.Align ment = DataGridViewContentAlignment.TopCenter;
dataGridViewX1.Font = new Font("tahoma", 8);
dataGridViewX1.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;

label1.DataBindings.Clear();
label1.DataBindings.Add("text", dt, "no");

richTextBoxEx1.Clear();
richTextBoxEx1.DataBindings.Clear();
richTextBoxEx1.DataBindings.Add("text", dt, "details");

richTextBoxEx2.Clear();
richTextBoxEx2.DataBindings.Clear();
richTextBoxEx2.DataBindings.Add("text", dt, "act");

sql2 = "select archive_n from archive";
da2 = new SqlDataAdapter(sql2, cnn);
dt2 = new DataTable();
da2.Fill(dt2);
comboBoxEx1.DisplayMember = "archive_n";
comboBoxEx1.DataSource = dt2;
if (dt.Rows.Count != 0)
label5.Text = Convert.ToString(dt.Rows.Count);
else
label5.Text = "0";
comboBoxEx2.Items.Clear();
comboBoxEx2.Items.Add("شماره نامه");
comboBoxEx2.Items.Add("تاریخ صدور");
comboBoxEx2.Items.Add("موضوع نامه");
comboBoxEx2.Items.Add("نام فرستنده");
comboBoxEx2.Items.Add("دستور یا ارجاع");
comboBoxEx2.SelectedIndex = 3;
comboBoxEx2.Enabled = true;

int j = dataGridViewX1.Rows.Count - 1;
dataGridViewX1.FirstDisplayedScrollingRowIndex = j ;

Waiting.ReportCompletedInForm();

}


اینم اول فرمم هست با مشخصات و تشکیلات و این صوبتا...


public partial class Search_Recive : Form
{
string cstr, sql1, sql2, datenow, time, backtime, backdate;
SqlConnection cnn;
SqlDataAdapter da, da1, da2;
DataTable dt, dt1, dt2;
byte[] binaryImage, empty = { };


public Search_Recive(string cstr1)
{
cstr = cstr1;
InitializeComponent();
}

fmehrvarzi
چهارشنبه 02 بهمن 1392, 03:09 صبح
میشه در خصوص این کد زیر منو راهنمایی کنید؟
من میخوام رویداد فرم لود رو براش لودینگ بزارم !
چیکار باید بکنم؟ببینید این کاری که کردم درسته؟


private void Search_Recive_Load(object sender, EventArgs e)
{
Waiting.CreateWaitingForm(typeof(Search_Recive), this);

cnn = new SqlConnection(cstr);
try
{
cnn.Open();
}
catch (SqlException Err)
{
MessageBox.Show("ارتباط با بانک اطلاعاتی برقرار نیست.در صورت وجود مشکل با مدیر پروژه تماس بگیرید", "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

System.Globalization.CultureInfo inp = new System.Globalization.CultureInfo("fa-ir");
InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(inp);

sql1 = "select no,date_no,sr_name,attach,archive,follow,details,a ct from letters where s_r=0 order by no";
da = new SqlDataAdapter(sql1, cnn);
dt = new DataTable();

da.Fill(dt);
dataGridViewX1.DataSource = dt;

dataGridViewX1.Columns[0].HeaderText = "شماره";
dataGridViewX1.Columns[1].HeaderText = "تاریخ صدور";
dataGridViewX1.Columns[2].HeaderText = "فرستنده";
dataGridViewX1.Columns[3].HeaderText = "پیوست";
dataGridViewX1.Columns[4].HeaderText = "بایگانی";
dataGridViewX1.Columns[5].HeaderText = "پیگیری";
dataGridViewX1.Columns[6].HeaderText = "موضوع";
dataGridViewX1.Columns[7].HeaderText = "دستور یا ارجاع";
dataGridViewX1.Columns[0].Width = 50;
dataGridViewX1.Columns[1].Width = 70;
dataGridViewX1.Columns[2].Width = 200;
dataGridViewX1.Columns[3].Width = 50;
dataGridViewX1.Columns[4].Width = 100;
dataGridViewX1.Columns[5].Width = 50;
dataGridViewX1.Columns[6].Width = 200;
dataGridViewX1.Columns[7].Width = 195;
dataGridViewX1.ColumnHeadersDefaultCellStyle.Font = new Font("tahoma", 8);
dataGridViewX1.ColumnHeadersDefaultCellStyle.Align ment = DataGridViewContentAlignment.TopCenter;
dataGridViewX1.Font = new Font("tahoma", 8);
dataGridViewX1.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;

label1.DataBindings.Clear();
label1.DataBindings.Add("text", dt, "no");

richTextBoxEx1.Clear();
richTextBoxEx1.DataBindings.Clear();
richTextBoxEx1.DataBindings.Add("text", dt, "details");

richTextBoxEx2.Clear();
richTextBoxEx2.DataBindings.Clear();
richTextBoxEx2.DataBindings.Add("text", dt, "act");

sql2 = "select archive_n from archive";
da2 = new SqlDataAdapter(sql2, cnn);
dt2 = new DataTable();
da2.Fill(dt2);
comboBoxEx1.DisplayMember = "archive_n";
comboBoxEx1.DataSource = dt2;
if (dt.Rows.Count != 0)
label5.Text = Convert.ToString(dt.Rows.Count);
else
label5.Text = "0";
comboBoxEx2.Items.Clear();
comboBoxEx2.Items.Add("شماره نامه");
comboBoxEx2.Items.Add("تاریخ صدور");
comboBoxEx2.Items.Add("موضوع نامه");
comboBoxEx2.Items.Add("نام فرستنده");
comboBoxEx2.Items.Add("دستور یا ارجاع");
comboBoxEx2.SelectedIndex = 3;
comboBoxEx2.Enabled = true;

int j = dataGridViewX1.Rows.Count - 1;
dataGridViewX1.FirstDisplayedScrollingRowIndex = j ;

Waiting.ReportCompletedInForm();

}


اینم اول فرمم هست با مشخصات و تشکیلات و این صوبتا...


public partial class Search_Recive : Form
{
string cstr, sql1, sql2, datenow, time, backtime, backdate;
SqlConnection cnn;
SqlDataAdapter da, da1, da2;
DataTable dt, dt1, dt2;
byte[] binaryImage, empty = { };


public Search_Recive(string cstr1)
{
cstr = cstr1;
InitializeComponent();
}

این کدها کار نمیکنه، چیزی که شما نیاز دارین Splash Screen هست که تو نسخه بعدی(4) این قابلیت اضافه میشود.

reza1699
چهارشنبه 02 بهمن 1392, 07:33 صبح
این کدها کار نمیکنه، چیزی که شما نیاز دارین Splash Screen هست که تو نسخه بعدی(4) این قابلیت اضافه میشود.

داداش من منتظرم ! اگه یک کاری کنید که بتونم توی فرم این کار رو انجام بدم به این صورتی که نوشتم (چیزی شبیه به این) تمام مشکلات من حله !

من منتظر نسخه 4 هستم !
یه لطفی هم اگه بکنید با ویژوال استادیو 2010 بنویسید پروژه مثال رو ممنون میشم ! چون 2012 روی سیستمم خیلی کنده و نمیشه نصبش کنم ! ممنون

fmehrvarzi
چهارشنبه 02 بهمن 1392, 13:34 عصر
داداش من منتظرم ! اگه یک کاری کنید که بتونم توی فرم این کار رو انجام بدم به این صورتی که نوشتم (چیزی شبیه به این) تمام مشکلات من حله !

من منتظر نسخه 4 هستم !
یه لطفی هم اگه بکنید با ویژوال استادیو 2010 بنویسید پروژه مثال رو ممنون میشم ! چون 2012 روی سیستمم خیلی کنده و نمیشه نصبش کنم ! ممنون

نسخه 4 همراه با آموزش افزوده شد از آموزش قسمت Splash Screen استفاده کنید مشکلتان حل می شود.

fmehrvarzi
چهارشنبه 02 بهمن 1392, 14:16 عصر
یه لطفی هم اگه بکنید با ویژوال استادیو 2010 بنویسید پروژه مثال رو ممنون میشم ! چون 2012 روی سیستمم خیلی کنده و نمیشه نصبش کنم ! ممنون
برای باز کردن فایل .sln (سولوشن) :
این فایل را با نوت پد باز کنید و سپس این خط را

Microsoft Visual Studio Solution File, Format Version 12.00
را به این خط تبدیل کنید

Microsoft Visual Studio Solution File, Format Version 11.00

reza1699
چهارشنبه 02 بهمن 1392, 23:05 عصر
داداش خیلی خوبه ! دمت گرم ! خیلی دارم نزدیک میشم به چیزی که میخوام ! یه مسئله ای فقط !
من این رو اینجوری به کار بردم :

private void buttonX1_Click(object sender, EventArgs e)
{
wt2.TextWaiting = "صبر کنید";
wt2.CreateInForm(typeof(Search_Recive), this, false, false, "DoWork2");

}
public void DoWork2()
{
sql1 = "select * from attachs where no=" + label1.Text;
SqlDataAdapter da3 = new SqlDataAdapter(sql1, cnn);
DataTable dt3 = new DataTable();
da3.Fill(dt3);
Report f = new Report(2);

sql1 = "select * from letters where no=" + label1.Text;
da1 = new SqlDataAdapter(sql1, cnn);
dt1 = new DataTable();
da1.Fill(dt1);

DataTable dtt = new DataTable();
dtt = dt1.Copy();
dtt.Merge(dt3);
f.dt = dtt;
f.ShowDialog();

}
همه چیز مرتبه ! فقط اون فرم جدیدم که باز میشه ، فرم لودینگ همچنان باقی مونده !
تأکید میکنم من میخوام از این طریق فرم جدیدم باز بشه ! اینجوری بیشتر به دردم میخوره ! تا اینکه بخوام متغییرها رو جابجا کنم و این صوبتا !
اگه بشه یه کدی بزارم توی رویداد لود فرم جدیدم که باز میشه تا اون پنجره لودینگ رو ببنده ، همه چی حله !

reza1699
پنج شنبه 03 بهمن 1392, 15:35 عصر
آقا این مسئله رو من اینجوری حل کردم : دم شما گرم ! کارم اوکی شد ! مرسی واقعا

private void buttonX1_Click(object sender, EventArgs e)
{
wt2.TextWaiting = "صبر کنید";
wt2.CreateInForm(typeof(Search_Recive), this, false, false, "DoWork2");
buttonX5.PerformClick();

}
public void DoWork2()
{

sql1 = "select * from attachs where no=" + label1.Text;
SqlDataAdapter da3 = new SqlDataAdapter(sql1, cnn);
DataTable dt3 = new DataTable();
da3.Fill(dt3);
sql1 = "select * from letters where no=" + label1.Text;
da1 = new SqlDataAdapter(sql1, cnn);
dt1 = new DataTable();
da1.Fill(dt1);

dtt = new DataTable();
dtt = dt1.Copy();
dtt.Merge(dt3);

}

private void buttonX5_Click(object sender, EventArgs e)
{
Report f = new Report(2);
f.dt = dtt;
f.ShowDialog();
}

fmehrvarzi
پنج شنبه 03 بهمن 1392, 18:12 عصر
آقا این مسئله رو من اینجوری حل کردم : دم شما گرم ! کارم اوکی شد ! مرسی واقعا
خواهش میکنم، این همه ملت دانلود کردن و تشکر یادشون رفت! حداقل 300 خط کد نوشتم چند روز وقتم گرفته شد.

reza1699
پنج شنبه 03 بهمن 1392, 19:46 عصر
داداش کارت درسته ! حرف نداشت ! من کلی گشتم توی نت چیز مشابهش نبود !
اگه بتونی روی پراگرس بارشم کار کنی ، یه چیز کامل میشه دیگه !
چون این موضوع مشکل خیلی هاس ! من خیلی جاها دیدم بعنوان مشکل مطرح شده ! خصوصا اینکه این انتظار ، یک انتظار واقعیه ! و نه ثابت.

fmehrvarzi
پنج شنبه 03 بهمن 1392, 22:03 عصر
داداش کارت درسته ! حرف نداشت ! من کلی گشتم توی نت چیز مشابهش نبود !
اگه بتونی روی پراگرس بارشم کار کنی ، یه چیز کامل میشه دیگه !
چون این موضوع مشکل خیلی هاس ! من خیلی جاها دیدم بعنوان مشکل مطرح شده ! خصوصا اینکه این انتظار ، یک انتظار واقعیه ! و نه ثابت.

ممنونم از لطف شما اون قسمتش رو اگر ملت برنامه نویس احتیاج داشتن مینویسم.

sagggad
جمعه 04 بهمن 1392, 16:55 عصر
باسلام
ممنون از برنامت
اما یه مشکل خیلی بد:
مثلا وقتی یه عملیات لود سنگین دارم این رو که میارم تو برنامه اول صبر میکنه تا این فرم انتظار کارش تموم بشه،بعد تازه شروع میکنه به لود کردن
چه کار کنم؟

fmehrvarzi
جمعه 04 بهمن 1392, 17:29 عصر
باسلام
ممنون از برنامت
اما یه مشکل خیلی بد:
مثلا وقتی یه عملیات لود سنگین دارم این رو که میارم تو برنامه اول صبر میکنه تا این فرم انتظار کارش تموم بشه،بعد تازه شروع میکنه به لود کردن
چه کار کنم؟
به خاطر این است که کدها را درست، به جاش بکار نبردین، ضمیمه کنید تا براتون درستش کنم

sagggad
جمعه 04 بهمن 1392, 17:53 عصر
متاسفانه نمیتونم برنامه رو اپ کنم
ببینید
برنامه در فرم لود یک بانک خیلی سنگین رو وارد لیست باکس میکنه
برای همین بالا اومدن فرم 6 ثانیه حدودا طول میکشه
خوب حالا اگه میشه بگید من چه کدی رو در کجا بنویسم تا درست عمل کنه
واقعا ممنونم

fmehrvarzi
جمعه 04 بهمن 1392, 18:04 عصر
متاسفانه نمیتونم برنامه رو اپ کنم
ببینید
برنامه در فرم لود یک بانک خیلی سنگین رو وارد لیست باکس میکنه
برای همین بالا اومدن فرم 6 ثانیه حدودا طول میکشه
خوب حالا اگه میشه بگید من چه کدی رو در کجا بنویسم تا درست عمل کنه
واقعا ممنونم
شما باید از قسمت آموزش زیر استفاده کنید که در آن mainform همان فرمی است که باتن 6 قرار دارد:
-------------------------------------
نمایش فرم انتظار برای انجام عملی زمانبر در داخل فرم اصلی توسط متد غیر استاتیک CreateInForm
------------------------------------

sagggad
جمعه 04 بهمن 1392, 18:32 عصر
ممنونم
متغیر رو فرقی نداره در کجا تعریف کنیم؟

sagggad
جمعه 04 بهمن 1392, 18:36 عصر
من از همین کد استفاده میکنم
اما انگار برنامه تا وقتی که این فرم بسته نشه به کارش ادامه نمیده

master 1
جمعه 04 بهمن 1392, 19:03 عصر
با عرض سلام من با یه دستور ساده دارم سورس صفحه رو تو richtextbox میرزیم به صورت زیر قرار دادم.ولی اشکالش اینه که اول فرم انتظار میاد بعدش که رفت شروع میکنه به گرفتن سورس.درحالی که من میخوام روی دکمه که کلیک کردم بیاد و تا زمانی که سورس رو نگرفته باشه بعد حذف شه کد رو اینطوری گذاشتم مشکل الان کجاست؟

LoadingForm.Waiting wt2 = new LoadingForm.Waiting();
private void button1_Click(object sender, EventArgs e)
{

wt2.TextWaiting = "صبر کنید";
wt2.CreateInForm(typeof(Form1), this, false, false, "DoWork2");




//title
string b, c;
string url1 = textBox1.Text;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url1);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
b = sr.ReadToEnd();
richTextBox1.Text = b;
}

public void DoWork2()
{
//Simulate Heavy Processing
System.Threading.Thread.Sleep(4000);
}
}

sagggad
جمعه 04 بهمن 1392, 19:07 عصر
با عرض سلام من با یه دستور ساده دارم سورس صفحه رو تو richtextbox میرزیم به صورت زیر قرار دادم.ولی اشکالش اینه که اول فرم انتظار میاد بعدش که رفت شروع میکنه به گرفتن سورس.درحالی که من میخوام روی دکمه که کلیک کردم بیاد و تا زمانی که سورس رو نگرفته باشه بعد حذف شه کد رو اینطوری گذاشتم مشکل الان کجاست؟

LoadingForm.Waiting wt2 = new LoadingForm.Waiting();
private void button1_Click(object sender, EventArgs e)
{

wt2.TextWaiting = "صبر کنید";
wt2.CreateInForm(typeof(Form1), this, false, false, "DoWork2");




//title
string b, c;
string url1 = textBox1.Text;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url1);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
b = sr.ReadToEnd();
richTextBox1.Text = b;
}

public void DoWork2()
{
//Simulate Heavy Processing
System.Threading.Thread.Sleep(4000);
}
}



مشکل من هم دقیقا همینه

fmehrvarzi
جمعه 04 بهمن 1392, 19:16 عصر
با عرض سلام من با یه دستور ساده دارم سورس صفحه رو تو richtextbox میرزیم به صورت زیر قرار دادم.ولی اشکالش اینه که اول فرم انتظار میاد بعدش که رفت شروع میکنه به گرفتن سورس.درحالی که من میخوام روی دکمه که کلیک کردم بیاد و تا زمانی که سورس رو نگرفته باشه بعد حذف شه کد رو اینطوری گذاشتم مشکل الان کجاست؟

LoadingForm.Waiting wt2 = new LoadingForm.Waiting();
private void button1_Click(object sender, EventArgs e)
{

wt2.TextWaiting = "صبر کنید";
wt2.CreateInForm(typeof(Form1), this, false, false, "DoWork2");




//title
string b, c;
string url1 = textBox1.Text;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url1);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
b = sr.ReadToEnd();
richTextBox1.Text = b;
}

public void DoWork2()
{
//Simulate Heavy Processing
System.Threading.Thread.Sleep(4000);
}
}


بسیار ممنونم دوست عزیز از گزارش باگتون
این یک باگ هست تو نسخه بعدی 4.1 در اسرع وقت ویرایش میشود.
نمیتوان به اشیاء فرم اول در حالت Write دسترسی داشت.

master 1
جمعه 04 بهمن 1392, 19:16 عصر
متغیرهایی که درون DoWork استفاده میشوند باید داخل DoWork تعریف شده باشند


لطفا راهنمایی فرمایید اصلا اینطوری نوشتم درسته ؟اگه نست درستش رو بگید

master 1
جمعه 04 بهمن 1392, 19:39 عصر
فایل رو ضمیمه نمیکنید

sagggad
جمعه 04 بهمن 1392, 19:48 عصر
جناب fmehrvarzi (http://barnamenevis.org/member.php?247078-fmehrvarzi) ما منتظریم

master 1
جمعه 04 بهمن 1392, 20:05 عصر
فکر کنم اینجوری باید باشه

LoadingForm.Waiting wt2 = new LoadingForm.Waiting();
private void button1_Click(object sender, EventArgs e)
{

wt2.TextWaiting = "صبر کنید";
wt2.CreateInForm(typeof(Form1), this, false, false, "DoWork2");





}

public void DoWork2()
{
//Simulate Heavy Processing
System.Threading.Thread.Sleep(4000);

//title
string z2, c;
string url1 = textBox1.Text;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url1);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
b = sr.ReadToEnd();
richTextBox1.Text = z2

}
}

ولی تو این قسمت این اروور رو داده


http://barnamenevis.org/images/misc/pencil.png

sagggad
جمعه 04 بهمن 1392, 20:31 عصر
نه اینجوری هیچکار انجام نمیده
کمـــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ــــــــک

fmehrvarzi
شنبه 05 بهمن 1392, 01:18 صبح
تو ورژن 4.1 این مشکل اصلاح شد آموزش در همان بخش با سه تذکر و متد ** اضافه شد، مثال بالا هم به پروژه به عنوان دمو اضافه شد.

fmehrvarzi
شنبه 05 بهمن 1392, 01:20 صبح
نه اینجوری هیچکار انجام نمیده
کمـــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ــــــــک

تو ورژن 4.1 این مشکل اصلاح شد آموزش در همان بخش با سه تذکر و متد ** اضافه شد، مثال بالا هم به پروژه به عنوان دمو اضافه شد.

fmehrvarzi
شنبه 05 بهمن 1392, 01:21 صبح
فکر کنم اینجوری باید باشه

LoadingForm.Waiting wt2 = new LoadingForm.Waiting();
private void button1_Click(object sender, EventArgs e)
{

wt2.TextWaiting = "صبر کنید";
wt2.CreateInForm(typeof(Form1), this, false, false, "DoWork2");





}

public void DoWork2()
{
//Simulate Heavy Processing
System.Threading.Thread.Sleep(4000);

//title
string z2, c;
string url1 = textBox1.Text;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url1);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
b = sr.ReadToEnd();
richTextBox1.Text = z2

}
}

ولی تو این قسمت این اروور رو داده


http://barnamenevis.org/images/misc/pencil.png

تو ورژن 4.1 این مشکل اصلاح شد آموزش در همان بخش با سه تذکر و متد ** اضافه شد، مثال بالا هم به پروژه به عنوان دمو اضافه شد.

sagggad
شنبه 05 بهمن 1392, 08:28 صبح
ممنون
اما درست نشد
ببینید من یک تابع دارم به اسم : Load
که عملیات سنگینی انجام میده
حالا میخوام همزمان با نمایش این لودینگ تابع نیز کارش رو انجام بده
توروخدا دقیق رهانماییم کنید

sagggad
شنبه 05 بهمن 1392, 09:04 صبح
ضمنا من از همون دستور هم که استفاده میکنم این ارور رو میده:
115885

fmehrvarzi
شنبه 05 بهمن 1392, 09:21 صبح
ممنون
اما درست نشد
ببینید من یک تابع دارم به اسم : Load
که عملیات سنگینی انجام میده
حالا میخوام همزمان با نمایش این لودینگ تابع نیز کارش رو انجام بده
توروخدا دقیق رهانماییم کنید
ببینید تابع لودتان اگر دارای متغیری است که در Form1 تعریف شده باشد مطمئناً کار نخواهد کرد.
شما برای فقط فراخوان (خواندنی)به متغیرهاتان از این تابع استفاده کنید
یک نمونه:
Form1 thisForm=LoadingForm.Waiting.formMain as Form1;
string _str = thisForm.textBox1.Text;
و برای نوشتن متغیرهاتان هم باید از فرمت ** استفاده کنید.

لطف کنید یک نمونه کوچک مثل همانی که دوستمون ساخت و مشکلشون را حل کردم ضمیمه کنید.

sagggad
شنبه 05 بهمن 1392, 09:31 صبح
بفرمایید
این کد من هست که در تابع لود مینویسم و میخوام همون اول که برنامه شروع میشه اجرا بشه (یعنی در اصل باید در فرم لود نوشته بشه) :

OleDbConnection con = new OleDbConnection();
con.ConnectionString = "provider=microsoft.jet.oledb.4.0;data source=|DataDirectory|\\Words.mdb;user id=; password=;";
OleDbCommand command = new OleDbCommand();
con.Open();
command.Connection = con;
command.CommandText = "select * from fatoen";
OleDbDataReader readre = command.ExecuteReader;
if (readre.HasRows == true) {
while (readre.Read()) {
lst2.Add(readre.GetString(0));
lst1.Add(readre.GetString(1));
ListBox1.Items.Add(readre.GetString(0));
}
}
con.Close();
Label1.Text = "تعداد کلمات موجود در حافظه : " + ListBox1.Items.Count;

حالا وقتی برنامه شروع میشه،چون بانک اطلاعاتیم بیشاز 70000 رکورد داره این برنامه برای لود شدن 6 ثانیه طول میده
حالا میخوام همزمان اون فرم نشون داده بشه به کاربر
لطفا یه جوری توضیح بدید که متوجه بشم

sagggad
شنبه 05 بهمن 1392, 11:55 صبح
ممنون
من منتظرم

fmehrvarzi
یک شنبه 06 بهمن 1392, 08:14 صبح
بفرمایید
این کد من هست که در تابع لود مینویسم و میخوام همون اول که برنامه شروع میشه اجرا بشه (یعنی در اصل باید در فرم لود نوشته بشه) :

OleDbConnection con = new OleDbConnection();
con.ConnectionString = "provider=microsoft.jet.oledb.4.0;data source=|DataDirectory|\\Words.mdb;user id=; password=;";
OleDbCommand command = new OleDbCommand();
con.Open();
command.Connection = con;
command.CommandText = "select * from fatoen";
OleDbDataReader readre = command.ExecuteReader;
if (readre.HasRows == true) {
while (readre.Read()) {
lst2.Add(readre.GetString(0));
lst1.Add(readre.GetString(1));
ListBox1.Items.Add(readre.GetString(0));
}
}
con.Close();
Label1.Text = "تعداد کلمات موجود در حافظه : " + ListBox1.Items.Count;

حالا وقتی برنامه شروع میشه،چون بانک اطلاعاتیم بیشاز 70000 رکورد داره این برنامه برای لود شدن 6 ثانیه طول میده
حالا میخوام همزمان اون فرم نشون داده بشه به کاربر
لطفا یه جوری توضیح بدید که متوجه بشم

این نوع کد نویسی Performance را پایین میآورد، چون هر بار که متد Add فراخوانی میشود UI، خود را repaint میکند.
بهتراست از BeginUpdate و EndUpdate استفاده کنید: وقتی که متد EndUpdate فراخوانی شد در نهایت تمامی آیتم ها به یکباره به کنترل اضافه میشود،
منبع:http://msdn.microsoft.com/en-us/library/system.windows.forms.listbox.beginupdate(v=vs.110) .aspx

sagggad
یک شنبه 06 بهمن 1392, 10:21 صبح
ممنون
متوجه نشدم
کار این دوتا متد چیه؟

sagggad
یک شنبه 06 بهمن 1392, 10:39 صبح
آقا واقعا ممنون
سرعت کار 10 برابر شد
متشکرم

fmehrvarzi
یک شنبه 06 بهمن 1392, 12:25 عصر
آقا واقعا ممنون
سرعت کار 10 برابر شد
متشکرم
خواهش میکنم ، در مورد نمایش فرم انتظار در این گونه موارد باید از جنریک استفاده کرد، با همون ورژنی که گفتم میتونید فرم انتظار را حتی برای این نوع کدهاتون بکارببرید

fmehrvarzi
یک شنبه 06 بهمن 1392, 12:52 عصر
بفرمائید این هم نحوه استفاده از کدها برای نمایش فرم انتظار
private void button6_Click(object sender, EventArgs e)
{
wt2.TextWaiting = "صبر کنید";
object objBox = wt2.CreateInForm(typeof(MainForm), this, false, false, "MyDoWork1");

//UnBoxing...
List<string[]> lstBox = objBox as List<string[]>;
foreach (string[] strList in lstBox)
{
lst2.Add(strList[0]);
lst1.Add(strList[1]);
ListBox1.Items.Add(strList[2]);
}

}

public object MyDoWork1()//این متد در یک نخ دیگر در حال اجراست
{

List<string[]> _lstBox = new List<string[]>();

OleDbConnection con = new OleDbConnection();
con.ConnectionString = "provider=microsoft.jet.oledb.4.0;data source=|DataDirectory|\\Words.mdb;user id=; password=;";
OleDbCommand command = new OleDbCommand();
con.Open();
command.Connection = con;
command.CommandText = "select * from fatoen";
OleDbDataReader readre = command.ExecuteReader;
if (readre.HasRows == true)
{
while (readre.Read())
{

string[] _strBox = new string[3];

_strBox[0] = readre.GetString(0);
_strBox[1] = readre.GetString(1);
_strBox[2] = readre.GetString(0);

//lst2.Add(readre.GetString(0));
//lst1.Add(readre.GetString(1));
//ListBox1.Items.Add(readre.GetString(0));
_lstBox.Add(_strBox);
}
}
con.Close();

return _lstBox;
}

reza1699
شنبه 19 بهمن 1392, 23:46 عصر
آقا ما همچنان منتظر ورژن جدید با امکان پراگرس بار هستیم !

spsgorgan
سه شنبه 26 فروردین 1393, 23:04 عصر
سلام دوستان
من از IRSKIN استفاده می کنم. تاحالا فرم رو بصورت
app.from1 form = new app.form1();
form.ShowDialog();
نمایش میدادم . اما از زمانیکه از DLL بهره میخوام ببرم این اسکین نمیاد. چه راه حلی پیشنهاد می فرمایید؟

سپاس از شما

fmehrvarzi
چهارشنبه 03 اردیبهشت 1393, 08:00 صبح
یک فرم جدید بسازید که از فرم آیریس اسکینتان ارث بری کند:

public partial class ChildForm1 : app.from1 {
public ChildForm1()
{
InitializeComponent();

LoadingForm.Waiting.ReportCompleted();
}
}


سپس فضای نام زیر را به فرم والد تان ParrentForm اضافه کنید
//add this name space
using LoadingForm;

و برای نمایش فرمتان از این کد استفاده کنید
// In Your ParrentForm
Waiting.CreateForm(typeof(ChildForm1));