PDA

View Full Version : مبتدی: مشكل در ساخت يك حلقه for ويژه



rezankh
پنج شنبه 23 بهمن 1393, 14:42 عصر
باسلام
من يك ديتاگريد دارم كه داخلش تعدادي ركورد وجود داره. ميخوام جمع ستون خاصي ( مثلا ستون 2) رو براي هر 15 رديف از ابتدا (از 1 تا 15 ، 16 تا 30 و ...) حساب كنم و در يك متغيير ديگه اي (مثلا يك ديتاتيبل و يا هر چيز ديگه اي) بريزم
موندم حلقه for رو چه جوري بنويسم. مخصوصا كه ممكنه تعداد ركوردها بر 15 بخش پذير باشند و يا نه. كد زير رو نوشتم ولي كار نميكنه. يه جورايي گيج شدم چه جوري بنويسمش. دوستان اگه ميشه دوباره برام بنويسيد.

DataTable dtRukesh = new DataTable();
dtRukesh.Clear();
if (!dtRukesh.Columns.Contains("TotalBim"))
dtRukesh.Columns.Add("TotalBim");
if (!dtRukesh.Columns.Contains("Green"))
dtRukesh.Columns.Add("Green");
if (!dtRukesh.Columns.Contains("Harm"))
dtRukesh.Columns.Add("Harm");
if (!dtRukesh.Columns.Contains("Gheramat"))
dtRukesh.Columns.Add("Gheramat");


//جواب تقسيم يا همان خارج قسمت
int m = dataGridView2.Rows.Count / 15;
//باقيمانده تقسيم
int x = dataGridView2.Rows.Count % 15;



for (int n = 0; n == m; ++n)
{
double tb = 0;
double gr = 0;
double ha = 0;

for (int i = ((dataGridView2.Rows.Count - x) - (15 * n)); i < (((dataGridView2.Rows.Count - x) - (15 * n)) + 15); ++i)
//for (int i = ((15 * n)); i < ((dataGridView2.Rows.Count - x) - (15 * (m - (n+1)))); ++i)
{
tb = tb + double.Parse(dataGridView2.Rows[i].Cells[8].Value.ToString());
gr = gr + double.Parse(dataGridView2.Rows[i].Cells[9].Value.ToString());
ha = ha + double.Parse(dataGridView2.Rows[i].Cells[10].Value.ToString());
//g = g + double.Parse(dataGridView2.Rows[i].Cells[13].Value.ToString());
}

DataRow drSpace2 = dtRukesh.NewRow();

drSpace2["TotalBim"] = tb;
drSpace2["Green"] = gr;
drSpace2["Harm"] = ha;
//drSpace2["Gheramat"] = g;
dtRukesh.Rows.Add(drSpace2);

}

sajadsobh
پنج شنبه 23 بهمن 1393, 17:05 عصر
با این قطعه کد مقادیر یه سلول از دیتاگرید رو از بالا 15تا 15تا جمع میکنه تو یه متغیر از نوع آرایه ذخیره میکنه:

int i, j, k;
k = 0;
int m = dataGridView1.Rows.Count;
int n = (m % 15) == 0 ? (m / 15) : (m / 15) + 1;
int[] num = new int[n];
for (i = 0; i < n; i++)
{
for (j = k; j < k + 15; j++)
{
if (j == m)
{
break;
}
else
num[i] += Convert.ToInt32(dataGridView1.Rows[j].Cells[1].Value);
}
k = j;
}

for (i = 0; i < n; i++)
{
MessageBox.Show(num[i].ToString());
}

البته من فرض کردم اون فیلدی که من میخوام مقادیرش جمع بشه فیلد دوم ِ من در جدول باشه، واسه همین از Cells[1] استفاده کردم.

rezankh
پنج شنبه 23 بهمن 1393, 18:44 عصر
خيلي ممنون. بايد منو ببخشيد ولي من رشتم كامپيوتر نيست و برنامه نويسي و زبان C# رو از روي علاقه از طريق اينترنت ياد گرفتم. واسه همين هم درك بعضي كدها برام كمي مشكل ميشه.
بعضي از خطوط برام سواله بويژه

int m = dataGridView1.Rows.Count - 1;
//چرا يك واحد كم كرديد؟
int n = (m % 15) == 0 ? (m / 15) : (m / 15) + 1;
//اين خط اگه ميشه يك توضيح كوچيك بديد
int[] num = new int[n];
// ونيز علامت [] اينجا چه وظيفه اي داره؟

num[i] += Convert.ToInt32(dataGridView1.Rows[j].Cells[1].Value);
//و نيز ستونهايي كه من ميخوام با هم جمع بشند همه اعشاري هستند. لذا نبايد نوع i و num به double يا decimal تبديل بشند؟


با عرض پوزش اگه ممكنه مرحله به مرحله توضيح بديد چيكار ميكنيد و يا يكمثال كوچيك بزاريد.
ممنون

sajadsobh
پنج شنبه 23 بهمن 1393, 19:14 عصر
عذرخواهی میکنم. پست قبلی اصلاح شد. حالا که مقادیر شما اعشاری هست پس کد به این صورت میشه:

int i, j, k;
k = 0;
int m = dataGridView1.Rows.Count;
int n = (m % 15) == 0 ? (m / 15) : (m / 15) + 1;
decimal[] num = new decimal[n];
for (i = 0; i < n; i++)
{
for (j = k; j < k + 15; j++)
{
if (j == m)
{
break;
}
else
num[i] += Convert.ToDecimal(dataGridView1.Rows[j].Cells[1].Value);
}
k = j;
}

for (i = 0; i < n; i++)
{
MessageBox.Show(num[i].ToString());
}

sajadsobh
پنج شنبه 23 بهمن 1393, 19:58 عصر
من فیلد جدول رو توی دیتابیس از نوع decimal(4,2) در نظر گرفتم.
خب من اومدم اول حساب کردم ببینم که تعداد ردیف های این جدول چند تا 15تا میشه و این مقدار رو توی n ذخیره کردم.

int n = (m % 15) == 0 ? (m / 15) : (m / 15) + 1;
m / 15 حاصل تقسیم صحیح رو برمیگردونه (یعنی حاصل 65/15 میشه 4) دستور بالا میگه که اگر تعداد ردیف ها بر 15 بخشپذیر بود مقدار m / 15 رو داخل n بریز و اگر که بخشپذیر نبود یعنی اینکه پس یه دسته ردیف وجود داره که 15 تا نیست ولی ما باید به حساب بیاریمش. پس تعداد دسته های 15تایی ما یکی اضافه میشه ---> (m / 15) + 1

decimal[] num = new decimal[n];
بعدش اینکه شما فرمودی حاصل این جمع ها رو باید داخل یه متغیر ذخیره کنی. ما به اندازه همون دسته های 15تایی ردیف متغیر نیاز داریم. تعریف بالا میاد یه آرایه از نوع اعشاری میسازه و طول این آرایه رو n در نظر میگیره. یعنی وقتی 5تا دسته 15تایی داشته باشیم (که البته ممکنه شامل 4تا دسته ی 15تایی باشه و 1دسته ی کمتر از 15تا) ما به 5تا متغیر نیاز داریم که حاصل جمع این 5 دسته رو بریزیم توش. پس طول آرایه میشه 5. یعنی میشه این:
decimal[] num = new decimal[5];

در آخر هم که تبدیل به decimal صورت گرفته!
سوال دیگه ای بود در خدمتم :چشمک:

rezankh
جمعه 24 بهمن 1393, 00:23 صبح
دستتون درد نكنه عالي بود اما مشكله كه دارم اينه كه بايد جمع چند ستون رو بگيرم يعني علاوه بر ستون 1 مي بايست جمع ستونهاي 2 و 3 و 4 رو بهمون صورت بدست بيارم. بجاي حلقه i از حلقه هاي ديگه استفاده كردم كه جواب نداد ميشه براي يه ستون ديگه هم كد رو لحاظ كنيد.

SabaSabouhi
جمعه 24 بهمن 1393, 00:55 صبح
سلام
یه سوال دارم، چرا عملیات رو روی DataSource انجام نمی‌دی و روی DataGrid انجام می‌دی؟

صبا صبوحی

rezankh
جمعه 24 بهمن 1393, 02:03 صبح
ديتاسورس ديتا گريد يك ديتاتيبل مجازييه كه خودش اطلاعات از جاي ديگه گرفته. به نظر شما فرقي ميكنه بخوام حلقه هاي for رو روي ديتا تيبل مجازي انجام بدم؟

sajadsobh
جمعه 24 بهمن 1393, 02:28 صبح
خب من واسه 3تا ستون این رو بسط میدم. شما حالا هر چندتا ستون میخواین اضافه کنید. اینجا باید از آرایه چند بُعدی استفاده بشه. به این شکل:

int i, j, k;
k = 0;
int m = dataGridView1.Rows.Count;
int n = (m % 15) == 0 ? (m / 15) : (m / 15) + 1;
decimal[,] num = new decimal[n,3];

for (i = 0; i < n; i++)
{
for (j = k; j < k + 15; j++)
{
if (j == m)
{
break;
}
else
num[i, 0] += Convert.ToDecimal(dataGridView1.Rows[j].Cells[1].Value);
}
k = j;
}

k = 0;
for (i = 0; i < n; i++)
{
for (j = k; j < k + 15; j++)
{
if (j == m)
{
break;
}
else
num[i, 1] += Convert.ToDecimal(dataGridView1.Rows[j].Cells[2].Value);
}
k = j;
}

k = 0;
for (i = 0; i < n; i++)
{
for (j = k; j < k + 15; j++)
{
if (j == m)
{
break;
}
else
num[i, 2] += Convert.ToDecimal(dataGridView1.Rows[j].Cells[3].Value);
}
k = j;
}


for (i = 0; i < n; i++)
{
MessageBox.Show(num[i, 0].ToString());
}
for (i = 0; i < n; i++)
{
MessageBox.Show(num[i, 1].ToString());
}
for (i = 0; i < n; i++)
{
MessageBox.Show(num[i, 2].ToString());
}

rezankh
جمعه 24 بهمن 1393, 10:44 صبح
آقا سجاد دستتون درد نكنه درست شد خيلي ممنون. من فقط به جاي

for (i = 0; i < n; i++)
{
MessageBox.Show(num[i, 0].ToString());
}
for (i = 0; i < n; i++)
{
MessageBox.Show(num[i, 1].ToString());
}
for (i = 0; i < n; i++)
{
MessageBox.Show(num[i, 2].ToString());
}


اين كد رو نوشتم تا جمع ها رو بريزه داخل يه ديتاتيل و گريد ديگه

for (i = 0; i < n; i++)
{
DataRow drSpace3 = dtRukesh.NewRow();

drSpace3["TotalBim"] = num[i, 0];
drSpace3["Green"] = num[i, 1];
drSpace3["Harm"] = num[i, 2];
dtRukesh.Rows.Add(drSpace3);
}

اين ديتاتيبل نهايي رو هم ميفرستم به استيمول جهت چاپ فرم روكشم در گزراش. باز هم خيلي لطف كردين ممنون.