PDA

View Full Version : سوال: چگونگی نمایش اطلاعات دیتاتیبل در 7 تکس باکس



f.beigirad
پنج شنبه 23 آذر 1391, 16:38 عصر
با سلام.
این یه سیمپل از برناممه.
اسم سه تا استان تو کمبو ، لیست میشه.
هر کدوم اینا رو که انتخاب کنیم ، اسامی شهراش توی یه دیتاتیبل لیست میشه.
و 6 تا لیبل اسامی این شهر هارو نشون میدن.
باتن رو که میزنیم 6 تای بعدی رو نشون میده.
برای مثال استان اول 55 شهر داره.54 تا از شهرا که نشون داده میشن ، تعداد لیبل ها 6 تاست اما رکور های باقی مونده یکیه.
برنامه اینجا ارور میده.

چجوری برنامه رو بنویسم که وقتی تعداد رکورد ها تموم شد بقیه ی لیبل هارو خالی کنه و خود برنامه هم ارور نده.

نیاز به یه الگوریتم هس که نمیتونم بنویسمش.

ببخشید نتونستم رو سرور این برنامه آپش کنم.

بفرمایید اینم لینک دانلود :

http://s3.picofile.com/file/7583541177/New.rar.html

از اساتید کمال تشکر رو دارم برای راهنمایی هاشون.
خواهشا یه نگاهی بندازید.

SHD.NET
پنج شنبه 23 آذر 1391, 17:10 عصر
داداش اگه سورسشو بزاری خیلی راحت تر و زودتر جوابتو می گیری

:چشمک:\\\موفق باشید///:چشمک:

مهرداد صفا
پنج شنبه 23 آذر 1391, 19:23 عصر
با سلام.
این یه سیمپل از برناممه.
اسم سه تا استان تو کمبو ، لیست میشه.
هر کدوم اینا رو که انتخاب کنیم ، اسامی شهراش توی یه دیتاتیبل لیست میشه.
و 6 تا لیبل اسامی این شهر هارو نشون میدن.
باتن رو که میزنیم 6 تای بعدی رو نشون میده.
برای مثال استان اول 55 شهر داره.54 تا از شهرا که نشون داده میشن ، تعداد لیبل ها 6 تاست اما رکور های باقی مونده یکیه.
برنامه اینجا ارور میده.

چجوری برنامه رو بنویسم که وقتی تعداد رکورد ها تموم شد بقیه ی لیبل هارو خالی کنه و خود برنامه هم ارور نده.

نیاز به یه الگوریتم هس که نمیتونم بنویسمش.

ببخشید نتونستم رو سرور این برنامه آپش کنم.

بفرمایید اینم لینک دانلود :

http://s3.picofile.com/file/7583541177/New.rar.html

از اساتید کمال تشکر رو دارم برای راهنمایی هاشون.
خواهشا یه نگاهی بندازید.


سلام
کد تابع زیر را :

public void LabelRefresh(int i)
{
if (i<5)
{
switch (i)
{
case 0:
label1.Text = "";
label2.Text = "";
label3.Text = "";
label4.Text = "";
label5.Text = "";
label6.Text = "";

break;
case 1:
label1.Text = dt.Rows[row]["shahrname"].ToString();
label2.Text = "";
label3.Text = "";
label4.Text = "";
label5.Text = "";
label6.Text = "";

break;
case 2:
label1.Text = dt.Rows[row]["shahrname"].ToString();
label2.Text = dt.Rows[row + 1]["shahrname"].ToString();
label3.Text = "";
label4.Text = "";
label5.Text = "";
label6.Text = "";

break;
case 3:
label1.Text = dt.Rows[row]["shahrname"].ToString();
label2.Text = dt.Rows[row + 1]["shahrname"].ToString();
label3.Text = dt.Rows[row + 2]["shahrname"].ToString();
label4.Text = "";
label5.Text = "";
label6.Text = "";

break;
case 4:
label1.Text = dt.Rows[row]["shahrname"].ToString();
label2.Text = dt.Rows[row + 1]["shahrname"].ToString();
label3.Text = dt.Rows[row + 2]["shahrname"].ToString();
label4.Text = dt.Rows[row + 3]["shahrname"].ToString();
label5.Text = "";
label6.Text = "";

break;
case 5:
label1.Text = dt.Rows[row]["shahrname"].ToString();
label2.Text = dt.Rows[row + 1]["shahrname"].ToString();
label3.Text = dt.Rows[row + 2]["shahrname"].ToString();
label4.Text = dt.Rows[row + 3]["shahrname"].ToString();
label5.Text = dt.Rows[row + 4]["shahrname"].ToString();;
label6.Text = "";

break;

}
}
else if (i>=5)
{
label1.Text = dt.Rows[row]["shahrname"].ToString();
label2.Text = dt.Rows[row + 1]["shahrname"].ToString();
label3.Text = dt.Rows[row + 2]["shahrname"].ToString();
label4.Text = dt.Rows[row + 3]["shahrname"].ToString();
label5.Text = dt.Rows[row + 4]["shahrname"].ToString();
label6.Text = dt.Rows[row + 5]["shahrname"].ToString();

}


}

به شکل زیر تغییر دهید:

public void LabelRefresh(int i)
{
for (int j = 1; j <= 6; j++)
{
if (j + row < dt.Rows.Count)
{
(this.Controls.Find("label" + j.ToString(), true)[0] as Label).Text = dt.Rows[row + j]["shahrname"].ToString();

}
else
{
this.Controls.Find("label" + j.ToString(), true)[0].Text = "";
}
}
return;}
درضمن چون row به صورت سراسری تعریف شده و به عنوان پارامتر استفاده میشود این تابع نیاز به آرگومنت ندارد. در واقع چون row=i پس میتوانید i را حذف کنید.

f.beigirad
جمعه 24 آذر 1391, 19:40 عصر
داش واقعا ممنونم.ازش چیزی متوجه نشدم اما کارمو راه انداخت.
داش متاسفانه این تابع رکورد اولو نشون نمیده.یعنی از رکورد دوم شروع به نمایش میکنه.

میشه راهنماییم کنی؟

مهرداد صفا
جمعه 24 آذر 1391, 19:59 عصر
سلام
خواهش میکنم
کد را به این صورت تغییر دهید:

public void LabelRefresh(int i)}
for(int j = 0; j < 6; j++){
if(j + row < dt.Rows.Count)
{
(this.Controls.Find("label"+( j+1).ToString(), true)[0] asLabel).Text = dt.Rows[row + j]["shahrname"].ToString();
}
else{
this.Controls.Find("label"+ (j+1).ToString(), true)[0].Text = "";
}}}

f.beigirad
جمعه 24 آذر 1391, 20:03 عصر
یه دنیا ممنون دوست عزیز.

میشه یکمم این کدارو توضیح بدی؟
(this.Controls.Find("label" + (j + 1).ToString(), true)[0] as Label).Text = dt.Rows[row + j]["SignDesc"].ToString();
this.Controls.Find("label" + (j+1).ToString(), true)[0].Text = "";

مهرداد صفا
جمعه 24 آذر 1391, 20:33 عصر
یه دنیا ممنون دوست عزیز.

میشه یکمم این کدارو توضیح بدی؟
(this.Controls.Find("label" + (j + 1).ToString(), true)[0] as Label).Text = dt.Rows[row + j]["SignDesc"].ToString();
this.Controls.Find("label" + (j+1).ToString(), true)[0].Text = "";


خواهش میکنم!
ببینید ما شش label داریم که نامهای آنها label1,label2....label6 هست و باید به آنها مقدار بدهیم، از طرفی هم یک حلقه داریم به نام j که از 0 تا 5 تکرار میشود، متود this.Controls.Find هم که با استفاده از نام کنترل آن را برایمان پیدا میکند. پس در حلقه label + (j+1).ToString() یعنی هر بار یکی از label ها (از label1 تا label6) را میگیریم.
در طرف دیگر هم که میخواهیم از row به بعد شش ردیف را به label متناظرش نسبت دهیم. پس به جای اینکه در شش خط بنویسیم:


table.rows[row+1]...
table.rows[row+2]..
table.rows[row+6]
از متغیر شمارنده حلقه برای دسترسی به شش ردیف استفاده کردیم.

f.beigirad
جمعه 24 آذر 1391, 20:37 عصر
این قسمت چه کار میکنه؟
, true)[0] as Label)

f.beigirad
جمعه 24 آذر 1391, 20:38 عصر
این قسمت چه کار میکنه؟
, true)[0] as Label)

nathan
جمعه 24 آذر 1391, 22:11 عصر
سلام عزیز دل خوشحالم که سوالتو می بینم ببین متد Find مربوط به Control دارای دو آرگومان هست که اولی از نوع string و دومی از نوع bool. وظیفه اولی که مشخصه میره تمام کنترلهای هم نام با آرگومانی رو که براش معلوم کردی بر می گردونه. اون true دوم هم برای اینه که بره تمام Children ها هم آیا بگرده یا نه فقط در سطح اصلی خود فرم جستجو کنه چون آیتمهایی مثل groupbox یا panel هستند که حالت Container دارند و کنترلهای داخلشون از فرم جدا در نظر میاد. در مورد as Label هم باید بگم که این یک تبدیل کننده هستش یعنی control رو که یک حالت عمومی و کلی هستش رو به label که کلاسی اختصاصی هست تبدیل می کنه تا بتونید از خواص و متدهای یک Label استفاده کنید.