PDA

View Full Version : سوال: بدست آوردن ضرب و جمع مقادیر هر سطر و ستون از دیتاگرید ویو با رفتن به سطر بعدی !



ghasem110deh
پنج شنبه 13 فروردین 1394, 21:32 عصر
سلام به همه ...
چطور میشه حاصل ضرب تو سلول (از یک سطر) رو در سلول بعدی ریخت !
و اگر کاربر یک سطر دیگر را پر کرد ، ارقام ستون آخر (حاصلضرب) رو جمع کرد ؟

مثل این عکس :

http://s4.picofile.com/file/8180311542/DGVfactor.png

البته نمیخوام با زدن دکمه یا چیز دیگه باشه ! هر سطر که پر شد جمع توی تکست باکس ریخته بشه !

am_al_59
پنج شنبه 13 فروردین 1394, 21:48 عصر
شما باید در رویداد CellEndEdit کدهای محاسباتیتو بنویسی
کد نمونه این میشه:


private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
dataGridView1.Rows[e.RowIndex].Cells[2].Value=Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[0].Value)*Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[1].Value);
int sum=0;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
sum += (int)dataGridView1.Rows[i].Cells[2].Value;
payableTextBox.Text=sum.ToString();
}


در مثال بالا برای گرید سه ستون فرض شده با تغییر عدد در ستون اول یا دوم حاصل ضرب در ستون سوم و مجموع ستون سوم در TextBox نمایش داده می شود.
باید ستون سوم رو به دلیل اینکه مقدارش نتیجه محاسبه هست در حالت ReadOnly قرار بدی

ghasem110deh
پنج شنبه 13 فروردین 1394, 22:10 عصر
ممنون !
من تو اینا زدم ولی خطا میداد :

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) {

}




private void dataGridView1_Leave(object sender, EventArgs e)
{

}

بازم ممنون ...



باید ستون سوم رو به دلیل اینکه مقدارش نتیجه محاسبه هست در حالت ReadOnly قرار بدی


چطوری ؟

و اگه اون دو تا ستون اول رو اضافه کنم که نمی ریزه به هم ؟

ghasem110deh
پنج شنبه 13 فروردین 1394, 22:23 عصر
کدم اینه : (تو متود واسه لود فرم)

var dt = new DataTable(); dt.Columns.Add("Price", typeof(int));
dt.Columns.Add("Quantity", typeof(int));
dt.Columns.Add("Kol", typeof(int));
dataGridView1.DataSource = dt;
dataGridView1.Columns[0].HeaderText = "قیمت";
dataGridView1.Columns[1].HeaderText = "تعداد";
dataGridView1.Columns[2].HeaderText = "کل";

این خطا رو میده :

am_al_59
پنج شنبه 13 فروردین 1394, 22:25 عصر
Event اول به نظر من مناسب کار شما نیست چون در زمان کلیک روی Cell فرا خوانی میشه حالا ممکنه کاربر به جای کلیک با Enter بره قسمت بعدی که باعث میشه کدهای شما اجرا نشه

Event دوم خوبه فقط یک عیب داده هروقت کاربر یکی از Cell هارو انتخاب میکنه و ازش عبور میکنه چه با Enter چه با Click کدهای محاسباتی شما اجرا میشه حتی اگر مقادیر تغییر نکرده باشن و در این حالت اگر داده ها زیاد باشن و زمان محاسبه طولانی باشه کاربر اذیت میشه

بهترین رویداد CellValueChanged هست که فقط اگر مقدار تغییر کنه کد اجرا میشه

تعداد و ترتیب ستون ها کاملاً در اختیار خودتون هست برنامه نمونه ضمیمه هست که برای دسترسی به ستون ها از شماره ترتیب قرار گیریشون استفاده شده.
تر تمیز ترش اینه که شما برای هر ستونت یک اسم مربوط انتخاب کنی و برای دسترسی از اون اسم استفاده کنی اینطوری با تغییر ترتیب ستون ها مشکلی برای کدت پیش نمیاد
برای انتخاب اسم و همچنین ReadOnly کردن در حالت Design Mode وقتی گریدت در حالت Select باشه در قسمت بالا سمت راست یک فلش ریز نشون داده میشه که با کلیک روی اون میتونی به منوی مدیریت ستون ها دسترسی داشته باشی
از این منو گزینه Edit Columns رو انتخاب کن و تغییرات دلخواه رو بده

برنامه نمونه ضمیمه است

ghasem110deh
پنج شنبه 13 فروردین 1394, 23:16 عصر
الان فقط یه مشکل هست ...
جمع ستون سوم درست نیست ! همیشه بیشتر از حاصل جمعه !؟

am_al_59
پنج شنبه 13 فروردین 1394, 23:20 عصر
ببخشید اشتباه کد من بود حلقه for محاسبه جمع رو تغییر بده به

for (int i = 0; i < dataGridView1.Rows.Count; i++)
sum += (int)dataGridView1.Rows[i].Cells[2].Value;

ghasem110deh
پنج شنبه 13 فروردین 1394, 23:40 عصر
باز خطا داد ...
البته من دیتاگرید رو خالی میزارم ها ! (مقدار اولیه صفر بش نمیدم)

am_al_59
پنج شنبه 13 فروردین 1394, 23:47 عصر
توی برنامه نمونه مقادیر اولیه رو خالی کردم و مشکلی پیش نیومد

در مد Debug برنامه را اجرا کنید و خطایی که بهتون میده رو بفرمایید.
امیدوارم بتونم کمک کنم

ghasem110deh
جمعه 14 فروردین 1394, 00:03 صبح
وقتی سلول اولی رو پر میکنم و میخوام برم به سلول بعدی (با کلید جهت نما ، اینتر و ...) خطا میده
این عکس خطا :

am_al_59
جمعه 14 فروردین 1394, 00:09 صبح
خط

sum += (int)dataGridView1.Rows[i].Cells[2].Value;


تبدیل کن به

sum += dataGridView1.Rows[i].Cells[2].Value == null ? 0 : Convert.ToInt32(dataGridView1.Rows[i].Cells[2].Value);

ghasem110deh
جمعه 14 فروردین 1394, 00:19 صبح
ایول ... درست شد !
اون علامت سوال دقیقا چیکار میکنه ؟ میگه اگه خالی بود ، برابر صفر کن

am_al_59
جمعه 14 فروردین 1394, 00:25 صبح
اون علامت سوال شرط قبلشو تست میکنه اگر شرط درست بود عبارت بعد از علامت سوال اگرنه عبارت بعد از دو نقطه رو بر میگردونه