PDA

View Full Version : جمع کردن مقادیر یک ستون از datagridview



programerinfonet
شنبه 12 مرداد 1392, 13:35 عصر
سلام دوستان
من داده های یک ستون از دیتاگریدم به این شکله
1.000.000 ریال
2.000.000 ریال
5.000.000 ریال
و...
حالا چه طوری می تونم جمع این ستون رو توی یک لیبل نمایش بدم ؟
مشکل "."ها و "ریال" می باشد

khokhan
شنبه 12 مرداد 1392, 13:39 عصر
سلام دوستان
من داده های یک ستون از دیتاگریدم به این شکله
1.000.000 ریال
2.000.000 ریال
5.000.000 ریال
و...
حالا چه طوری می تونم جمع این ستون رو توی یک لیبل نمایش بدم ؟
مشکل "."ها و "ریال" می باشد
البته قبلش بایستی یه متد برای split بنویسی لینک (http://www.dotnetperls.com/split)
در رویداد CellValueChanged دیتا گرید به جای total price نام ستون خودتونو می نویسین و به جای textbox4 نام لیبل تونو می نویسین


decimal sum = dataGridView1.Rows.OfType<DataGridViewRow>()
.Sum(row => Convert.ToDecimal(row.Cells["total_price"].Value));
textBox4.Text = sum.ToString();

sgh_programer
شنبه 12 مرداد 1392, 13:46 عصر
بنام خدا
سلام

چیزی که به ذهن من رسیده اینه

string str_mony1 = "120,000 ریال";
string str_mony2 = "ریال 20,000";
str_mony1 = str_mony1.Replace("ریال", "");
str_mony2 = str_mony2.Replace("ریال", "");
str_mony1 = str_mony1.Trim();
str_mony2 = str_mony2.Trim();
Int64 a = Int64.Parse(Convert.ToDecimal(str_mony1).ToString( ));
Int64 b = Int64.Parse(Convert.ToDecimal(str_mony2).ToString( ));
MessageBox.Show((a+b).ToString());


اجرا کن و نتیجه را ببین

موفق باشی

aliagamon
شنبه 12 مرداد 1392, 13:48 عصر
از این استفاده کن:

textBox1.Text = textBox1.Text.Replace(".", string.Empty);
textBox1.Text = textBox1.Text.Replace(" ریال", string.Empty);

sgh_programer
شنبه 12 مرداد 1392, 13:52 عصر
یا اینکه همزمان با نمایش اطلاعات در گرید ویو اونا رو با هم جمع کنی
البته روش های زیادی هست اما روشی که دوستمون khokhan گفتند منطقی تره
موفق باشی

programerinfonet
شنبه 12 مرداد 1392, 13:53 عصر
حالا اگر بخوام بگم به جای اینکه همه ی سطرهای ستون مورد نظر (ستون 5) رو انتخاب کنه فقط اون سطرهایی رو انتخاب کنه که ستون بعدیش (ستون ششم) مقدارش بدهکاره
ستون شش دو حالت بیشتر نداره یا بدهکار یا بستانکار

khokhan
شنبه 12 مرداد 1392, 14:10 عصر
حالا اگر بخوام بگم به جای اینکه همه ی سطرهای ستون مورد نظر (ستون 5) رو انتخاب کنه فقط اون سطرهایی رو انتخاب کنه که ستون بعدیش (ستون ششم) مقدارش بد***اره
ستون شش دو حالت بیشتر نداره یا بد***ار یا بستانکار
با یه foreach یا for ساده می تونی اندیس سطرهایی رو که ستون فلانشون ، بد..فلانه رو بدست بیاری و شرط می زاری که اگه فلان سطون از این سطرها فلانکار بود :لبخند: فلان ستونشون رو جمع کن

programerinfonet
شنبه 12 مرداد 1392, 14:17 عصر
به خدا من درست نوشتم نمی دونم چرا این جوری می افته ب د ه ک ا ر و ب س ت ا ن ک ا ر
:لبخند:

programerinfonet
شنبه 12 مرداد 1392, 14:23 عصر
الان با این کدی که شما دادید دارم جمع می کنم

decimal sum = dgv.Rows.OfType<DataGridViewRow>()
.Sum(row => Convert.ToDecimal(row.Cells[4].Value));
lblbestankar.Text = sum.ToString();

فقط همان طور که گفتم اول اینکه موندم اون "."و"ریال" رو تو این کد چه طور از بین ببرم و دوم اینکه شرط چک کردن ستون بعدیش
در واقع الان داده ها این شکلیه
1.000.000 ریال بدهکار
1.500.000 ریال بستانکار
2.000.000 ریال بدهکار
حالا چه طور اونهایی که بدهکارن رو جمع کنم ؟؟؟؟؟

khokhan
شنبه 12 مرداد 1392, 14:46 عصر
الان با این کدی که شما دادید دارم جمع می کنم

decimal sum = dgv.Rows.OfType<DataGridViewRow>()
.Sum(row => Convert.ToDecimal(row.Cells[4].Value));
lblbestankar.Text = sum.ToString();

فقط همان طور که گفتم اول اینکه موندم اون "."و"ریال" رو تو این کد چه طور از بین ببرم و دوم اینکه شرط چک کردن ستون بعدیش
در واقع الان داده ها این شکلیه
1.000.000 ریال بدهکار
1.500.000 ریال بستانکار
2.000.000 ریال بدهکار
حالا چه طور اونهایی که بدهکارن رو جمع کنم ؟؟؟؟؟

برای split کد شما بایستی یه چیزی در این مایه ها باشه :


string dgvCell = dataGridView1.Rows[0].Cells[0].Value.ToString();


dgvCell = dgvCell.Replace(@"ریال", "");
dgvCell = dgvCell.Replace(@",", "");

programerinfonet
شنبه 12 مرداد 1392, 14:54 عصر
ممنون اما تین کد بالا فقط یک سطر رو فکر کنم پوشش میده
و بعد من با این کدهای تیکه یه مقدار گیج شدم
الا این داده های من بود
اگه بخوام به روشی منطقی عمل کنم میشه یک بار دیگه کمکم کنید ؟

1.000.000 ریال بده کار
1.500.000 ریال بستانکار
2.000.000 ریال بده کار
ببخشید که این همه اذیتتون می کنم

khokhan
شنبه 12 مرداد 1392, 15:08 عصر
ممنون اما تین کد بالا فقط یک سطر رو فکر کنم پوشش میده
و بعد من با این کدهای تیکه یه مقدار گیج شدم
الا این داده های من بود
اگه بخوام به روشی منطقی عمل کنم میشه یک بار دیگه کمکم کنید ؟

1.000.000 ریال بده کار
1.500.000 ریال بستانکار
2.000.000 ریال بده کار
ببخشید که این همه اذیتتون می کنم
اینطوری بنویس :


for (int i = 0; i < dgv.Rows.Count; i += 1)
{
string dgvCell = dataGridView1.Rows[i].Cells[0].Value.ToString();


dgvCell = dgvCell.Replace(@"ریال", "");
dgvCell = dgvCell.Replace(@",", "");

یا اینطوری :


for (int i = 0; i < dgv.Rows.Count; i++)
{
string dgvCell = dataGridView1.Rows[i].Cells[0].Value.ToString();


dgvCell = dgvCell.Replace(@"ریال", "");
dgvCell = dgvCell.Replace(@",", "");

programerinfonet
شنبه 12 مرداد 1392, 15:19 عصر
for (int i = 0; i < dgv.Rows.Count; i += 1)
{
string dgvCell = dgv.Rows[i].Cells[0].Value.ToString();

dgvCell = dgvCell.Replace(@"ریال", "");
dgvCell = dgvCell.Replace(@",", "");
}

خوب با توجه به کد بالا من الان یک رشته به نام dgvcell دارم
حالا اینو چه جور ربطش بدم به کد پایین

decimal sum = dgv.Rows.OfType<DataGridViewRow>()
.Sum(row => Convert.ToDecimal(row.Cells[4].Value));
lblbestankar.Text = sum.ToString();

khokhan
شنبه 12 مرداد 1392, 15:27 عصر
حالا اگر بخوام بگم به جای اینکه همه ی سطرهای ستون مورد نظر (ستون 5) رو انتخاب کنه فقط اون سطرهایی رو انتخاب کنه که ستون بعدیش (ستون ششم) مقدارش بدهکاره
ستون شش دو حالت بیشتر نداره یا بدهکار یا بستانکار
البته من امتحانش نکردم خودتون زحمت ست کردنش رو بکشین یه چیزی شبیه این :

for (int i = 0; i < DataGridView1.Rows.Count; i++)
{
if (DataGridView1.Rows(i).Cells(5).Value == "بستانکار")
{
decimal sum = DataGridView1.Rows.OfType<DataGridViewRow>()
.Sum(row => Convert.ToDecimal(row.Cells[4].Value));
lblbestankar.Text = sum.ToString();
}
}

khokhan
شنبه 12 مرداد 1392, 15:37 عصر
for (int i = 0; i < dgv.Rows.Count; i += 1)
{
string dgvCell = dgv.Rows[i].Cells[0].Value.ToString();

dgvCell = dgvCell.Replace(@"ریال", "");
dgvCell = dgvCell.Replace(@",", "");
}

خوب با توجه به کد بالا من الان یک رشته به نام dgvcell دارم
حالا اینو چه جور ربطش بدم به کد پایین

decimal sum = dgv.Rows.OfType<DataGridViewRow>()
.Sum(row => Convert.ToDecimal(row.Cells[4].Value));
lblbestankar.Text = sum.ToString();

اینوامتحان کن ببین

for (int i = 0; i < DataGridView1.Rows.Count; i++)
{
string dgvCell = dataGridView1.Rows[i].Cells[0].Value.ToString();


dgvCell = dgvCell.Replace(@"ریال", "");
dgvCell = dgvCell.Replace(@",", "");
if (DataGridView1.Rows(i).Cells(5).Value == "بستانکار")
{
decimal sum = DataGridView1.Rows.OfType<DataGridViewRow>()
.Sum(row => Convert.ToDecimal(dgvCell.ToString()));
lblbestankar.Text = sum.ToString();
}
}

programerinfonet
شنبه 12 مرداد 1392, 15:46 عصر
نه نشد
خطا نداد اما جواب هم نداد
if رو حذف می کنمهمهشو انتخاب می کنه

khokhan
شنبه 12 مرداد 1392, 16:05 عصر
نه نشد
خطا نداد اما جواب هم نداد
if رو حذف می کنمهمهشو انتخاب می کنه
مشکل جمع کردن ستون چی ؟ درست می زنه ؟

programerinfonet
شنبه 12 مرداد 1392, 16:08 عصر
نه
اونم فقط رکورد آخر رو ضربدر تعداد رکوردها می کنه
:لبخند:

khokhan
شنبه 12 مرداد 1392, 16:13 عصر
نه
اونم فقط رکورد آخر رو ضربدر تعداد رکوردها می کنه
:لبخند:
:لبخند::لبخند::لبخند::قهقهه: عجب آشی پختیم !!! مااااااااااااااااااااااا

programerinfonet
شنبه 12 مرداد 1392, 16:23 عصر
داده ها
108423
یه کدی کوفتی هست که من بنویسم یه خروجی 5.500.000 به من بده ؟
طلسم شده این یه تیکه

khokhan
شنبه 12 مرداد 1392, 16:30 عصر
داده ها
108423
یه کدی کوفتی هست که من بنویسم یه خروجی 5.500.000 به من بده ؟
طلسم شده این یه تیکه
صبر کن من هم یه امتحانی بکنم ببینم مشکل از چیه ؟

khokhan
شنبه 12 مرداد 1392, 16:53 عصر
داده ها
108423
یه کدی کوفتی هست که من بنویسم یه خروجی 5.500.000 به من بده ؟
طلسم شده این یه تیکه
ببین این برای جمع ستون جواب می ده ؟

decimal total = 0;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
string dgvCell = dataGridView1.CurrentRow.Cells[5].Value.ToString();


dgvCell = dgvCell.Replace(@"ریال", "");
dgvCell = dgvCell.Replace(@",", "");
total += Convert.ToDecimal(dgvCell.ToString());
}

البته بدون در نظر گرفتن شرط این مورد رو امتحان کردم کاملا جواب می ده :لبخند:

programerinfonet
شنبه 12 مرداد 1392, 17:06 عصر
نه دوبازه همون آشو همون کاسه
رکورد آخری رو در تعداد کل رکوردها ضرب می کنه :گریه:

davidrobert
شنبه 12 مرداد 1392, 17:28 عصر
بفرمایید این کد مورد نیاز شما هم داخل دیتاگرید رو سه رغم اعضار جدا میکنه و داخل label هم جمع میکنه و سه رغم اعشار هم جدا میکنه و مقدار ریال هم آخر جمع عددش قرار میده.
private void Form1_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\Database1.mdf;Integrated Security=True;User Instance=True");
SqlCommand cmd = new SqlCommand();
SqlDataAdapter da = new SqlDataAdapter();
cmd.Connection = con;
DataTable dt = new DataTable();
cmd.CommandText = "select * from Table1";
da.SelectCommand = cmd;
da.Fill(dt);
dataGridView1.DataSource = dt;

//if (dataGridView1.CurrentRow == null)
// return;

int sum = 0;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
sum += Convert.ToInt32(dataGridView1.Rows[i].Cells["aa"].Value);
}
label1.Text = sum.ToString();
}

private void label1_TextChanged(object sender, EventArgs e)
{
string str = label1.Text;
double result = 0;
if (double.TryParse(str, out result))
{
label1.Text = String.Format("{0:#,#.#} ریال", result);

}
}

khokhan
شنبه 12 مرداد 1392, 20:22 عصر
نه دوبازه همون آشو همون کاسه
رکورد آخری رو در تعداد کل رکوردها ضرب می کنه :گریه:
این کد بدون لحاظ نمودن split می تونه شرط ستون بستانکار رو در جمع ستون مربوط به قیمت یا هرچی اعمال کنه یعنی در یه ستون اگه بد***ار و بستانکار باشه و در ستون دیگه مبلغ ،فقط اونهایی رو که بستانکار باشند درستون مربوط به مبلغ رو جمع می زنه و با بد***اران کاری نداره

البته گفتم در صورتی است که فرمت ستون مربوط به مبلغ عدد خالی باشه و ویرگول و ریال نداشته باشه
می تونی در رویداد CellValueChanged دیتا گرید بنویسی


int total = dataGridView1.Rows.Cast<DataGridViewRow>()
.Where(r => Convert.ToString(r.Cells["kind"].Value) == "بستانکار")
.Sum(t => Convert.ToInt32(t.Cells["price"].Value));
textBox4.Text = total.ToString();

programerinfonet
شنبه 12 مرداد 1392, 20:37 عصر
خیلی ممنون از زحمتی کشیدی و وقتی که گذاشتی
کاش میشد این دکمه ی تشکر رو چند بار زد
آخه نمیشه این رسال و ویرگول رو بردارم
نمیشه اینارو تو کدی که دادی یه جور جا کرد ؟؟؟؟؟
:گریه:

amir200h
شنبه 12 مرداد 1392, 20:37 عصر
من خودم این روش به ذهنم رسید. ببین به کارت میاد یا نه. البته با اجازه استاد khokhan :لبخند:
private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
float a=0;
for (int i = 0; i < dataGridView11.RowCount; i++)
{
a += float.Parse(dataGridView11.Rows[i].Cells[4].Value.ToString());
}
lblkol.Text = a.ToString();
}

programerinfonet
شنبه 12 مرداد 1392, 20:40 عصر
من خودم این روش به ذهنم رسید. ببین به کارت میاد یا نه. البته با اجازه استاد khokhan :لبخند:
private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
float a=0;
for (int i = 0; i < dataGridView11.RowCount; i++)
{
a += float.Parse(dataGridView11.Rows[i].Cells[4].Value.ToString());
}
lblkol.Text = a.ToString();
}
مرسی دوست عزیز
مشکل جمع زدن حل شده
مشکل اینه که این کدا واسه اعداد 1000000 به کار میاد نه 1.000.000 ریال

amir200h
شنبه 12 مرداد 1392, 20:46 عصر
مرسی دوست عزیز
مشکل جمع زدن حل شده
مشکل اینه که این کدا واسه اعداد 1000000 به کار میاد نه 1.000.000 ریال

private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
float a=0;
for (int i = 0; i < dataGridView11.RowCount; i++)
{
a += float.Parse(dataGridView11.Rows[i].Cells[4].Value.ToString().Replace(",",""));
}
lblkol.Text = a.ToString();
}

amir200h
شنبه 12 مرداد 1392, 20:47 عصر
البته شما بجای , که من گذاشتم از همون کاراکتری که واسه جدا کننده ت گذاشتی استفاده کن

private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
float a=0;
for (int i = 0; i < dataGridView11.RowCount; i++)
{
a += float.Parse(dataGridView11.Rows[i].Cells[4].Value.ToString().Replace(".",""));
}
lblkol.Text = a.ToString();
}

programerinfonet
شنبه 12 مرداد 1392, 20:53 عصر
توسط کد دوستمون amir200h (http://barnamenevis.org/member.php?63766-amir200h)جان درست شد

khokhan
شنبه 12 مرداد 1392, 20:55 عصر
خوشحالمون کردی :لبخند::لبخند::لبخند:

amir200h
شنبه 12 مرداد 1392, 21:02 عصر
خوشحالمون کردی :لبخند::لبخند::لبخند:
دست پرورده ایم :لبخند:

davidrobert
شنبه 12 مرداد 1392, 21:05 عصر
تبریک به دوست عزیرمون آخر سر طلسم کاریش شکست به وسیله دوست ارجمند amir200h (http://barnamenevis.org/member.php?63766-amir200h) .

programerinfonet
شنبه 12 مرداد 1392, 21:41 عصر
:لبخند:
آقا یه مورد

float a = 0;
for (int i = 0; i < dgv.RowCount; i++)
{
a += float.Parse(dgv.Rows[i].Cells[6].Value.ToString().Replace(",", "").Replace(" ریال ",""));
}

این کد مشکل منو حل کرد اما تمام رکوردها رو جمع می کنه دوباره
ولی من میخواستم فقط اونایی که مقدار ستون بعدیشون بستانکاره رو جمع کنه
این کد

if (dgv.Rows[i].Cells[7].Value == "بستانکار")

گفتم این حالا حالاها حل بشو نیست

amir200h
شنبه 12 مرداد 1392, 21:51 عصر
private void buttonX1_Click(object sender, EventArgs e)
{
float a = 0;
for (int i = 0; i < dataGridView1.RowCount; i++)
{
if (dataGridView1.Rows[i].Cells[2].Value.ToString() == "بستانکار")
{
a +=
float.Parse(dataGridView1.Rows[i].Cells[1].Value.ToString()
.Replace(",", "")
.Replace(" ریال ", ""));
}
}
MessageBox.Show(a.ToString());
}

kordestan
یک شنبه 19 اردیبهشت 1395, 11:36 صبح
ببخشید یه سوال مهم دارم
باید ستونی که میخوام جمعش کنم حتماً دادش از نوع int باشه؟آخه من nvarchar انتخاب کردم