PDA

View Full Version : سوال: رنگی کردن سطر های datagrid بر اساس شرط خاص



ozzy_mra
شنبه 29 آبان 1389, 11:04 صبح
دوستان سلام
می دونم سوالم تکراریه ولی لینکشو پیدا نکردم
می خواستم تو دیتا گریدم هر سطر با توجه به شرط خاصی دارای یه رنگ خاص! بشه
مثلاً بر اساس مقدار یه فیلد، اگر به فرض مقدار اون فیلد کمتر از 5 باشه سطر گرید آبی بشه اگر بین 5 تا 10 باشه اون سطر زرد واگه بیشتر از 10 باشه آبی بشه .
اگه ممکنه راهنماییم کنید. ممنون

Sk1900n3
شنبه 29 آبان 1389, 11:11 صبح
سلام دوست من
کد


for (int index = 0; index < this.dataGrd.RowCount; index++)
{
if (this.dataGrd.Rows[index].Cells["name Field"].Value.ToString() == "مقدار")
this.dataGrd.Rows[indexer].DefaultCellStyle.BackColor = Color.Red;
}

ایمان مدائنی
شنبه 29 آبان 1389, 11:12 صبح
براي اينكار ميتوني از حلقه استفاده كني تا بگرده و شرط مورد نظر رو پيدا كنه و در صورت درست بودن شرط رنگ رو عوض كنه

dataGridView1.Rows[0].DefaultCellStyle.BackColor = Color.Red;

shahin_sharifi
شنبه 29 آبان 1389, 11:21 صبح
با سلام
پاسخ دوستان دیگر هم کاملا درسته ولی من برای اینکه راحتر باشید پیشنهاد میکنم از foreach استفاده کنید که شما را از کنترل حلقه آسوده میکنه:

void set_color()
{
foreach (DataGridViewRow r in dataGridView2.Rows)
{
if (r.Cells[0].Value.ToString() == "A" || r.Cells[0].Value.ToString() == "a")
{
foreach (DataGridViewCell c in r.Cells)
{
c.Style.BackColor = System.Drawing.Color.MediumAquamarine;
}

}
else if (r.Cells[0].Value.ToString() == "B" || r.Cells[0].Value.ToString() == "b")
{
foreach (DataGridViewCell c in r.Cells)
{
c.Style.BackColor = System.Drawing.Color.LightSteelBlue;

}
}


}

}

ozzy_mra
شنبه 29 آبان 1389, 11:42 صبح
با سلام
پاسخ دوستان دیگر هم کاملا درسته ولی من برای اینکه راحتر باشید پیشنهاد میکنم از foreach استفاده کنید که شما را از کنترل حلقه آسوده میکنه:

void set_color()
{
foreach (DataGridViewRow r in dataGridView2.Rows)
{
if (r.Cells[0].Value.ToString() == "A" || r.Cells[0].Value.ToString() == "a")
{
foreach (DataGridViewCell c in r.Cells)
{
c.Style.BackColor = System.Drawing.Color.MediumAquamarine;
}

}
else if (r.Cells[0].Value.ToString() == "B" || r.Cells[0].Value.ToString() == "b")
{
foreach (DataGridViewCell c in r.Cells)
{
c.Style.BackColor = System.Drawing.Color.LightSteelBlue;

}
}


}

}


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

ozzy_mra
شنبه 29 آبان 1389, 14:27 عصر
راهی برای اینکه همزمان با بایند کردن این کار رو انجام بدیم نیست؟
کلاً روش بهینه تری وجود نداره؟ برای جدولی با 5 میلیون رکورد خیلی از زمان صرف این کار میشه

ایمان مدائنی
شنبه 29 آبان 1389, 14:32 عصر
ميتوني اول ديتا گريد رو پر كني و بعد يك PROGRESS BAR بزاري زير گريد تا اين كار را انجام بده و برنامه هنگ نكنه
و بعد VALUE شي PROGRESS BA برابر با مقدار ركوردها قرار بدي تا در زمان مناسب پر بشه
بعد از خوندن هر ركورد يك واحد به PROGRESS BA اضافه بشه
دوست عزيز راه ديگري نيست چون ديتا ست يك جدول مجازي است و خاصيت BACK COLOR نداره
مجبوري اينكار را بكني مگر اينكه ركوردها را خط به خط داخل گريد بريزي

ozzy_mra
شنبه 29 آبان 1389, 14:44 عصر
ميتوني اول ديتا گريد رو پر كني و بعد يك PROGRESS BAR بزاري زير گريد تا اين كار را انجام بده و برنامه هنگ نكنه
و بعد VALUE شي PROGRESS BA برابر با مقدار ركوردها قرار بدي تا در زمان مناسب پر بشه
بعد از خوندن هر ركورد يك واحد به PROGRESS BA اضافه بشه
دوست عزيز راه ديگري نيست چون ديتا ست يك جدول مجازي است و خاصيت BACK COLOR نداره
مجبوري اينكار را بكني مگر اينكه ركوردها را خط به خط داخل گريد بريزي

خیلی ممنونم
با BackgroundWorker این کارو انجام بدم دیگه؟
فقط دستوری که تعداد رکوردهای دیتا گرید رو بر می گردوند رو بهم میگید:بامزه::خجالت:

ایمان مدائنی
شنبه 29 آبان 1389, 14:46 عصر
والا من با BackgroundWorker كار نكردم
ولي دستوري كه من براي برگرداندن ركوردها استفاده ميكنم اينه

DataGridView1.Row.Count;

shahin_sharifi
یک شنبه 30 آبان 1389, 00:10 صبح
خیلی ممنونم
با BackgroundWorker این کارو انجام بدم دیگه؟
فقط دستوری که تعداد رکوردهای دیتا گرید رو بر می گردوند رو بهم میگید:بامزه::خجالت:

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

در مورد background worker باید بگم که شما نمی تونید استفاده کنید.چون این ابزار فقط توابع و عملیات محاسباتی رو پشتیبانی میکنه و اگر در داخل این عملیات کنترلی همچون گرید حضور داشته باشه خطا خواهد داد. شما میتونید قبل و بعد از تابع رنگی کردن یک progress bar رو نمایش و سپس مخفی کنید که کاربر در جریان عملیات قرار بگیره.

M.YasPro
یک شنبه 30 آبان 1389, 06:56 صبح
ميتوني اول ديتا گريد رو پر كني و بعد يك PROGRESS BAR بزاري زير گريد تا اين كار را انجام بده و برنامه هنگ نكنه

progressbar فقط مامور نمایش پیشرفت یک عملیات هست و ربطی به هنگ کردن یا نکردن پروسس نداره .
اگر تعداد رکورد هاتون زیاده باید از thread ها استفاده کنید .
اما اگر تعداد کم هست :


private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
if (dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString() == "a")
dataGridView1.Rows[e.RowIndex].Cells[0].Style.BackColor = Color.Red;
}

(البته کد بالا هم بعد از بایند شدن گرید به صورت اتوماتیک و به تعداد رکورد های دیتاسورس شما فایر میشه)
شاید ایونت بهتری برای اینکار وجود داشته باشه .

موفق باشید .

ozzy_mra
یک شنبه 30 آبان 1389, 08:12 صبح
دوست عزیز اگر شما دیتا گرید رو به سورس بایند کنید دیتا یکباره در داخل گرید ریخته میشه ولی اگر بخواهید دونه دونه اینکار رو انجام بدید سربار بیشتری رو به سیستم تحمیل میکنید.

در مورد background worker باید بگم که شما نمی تونید استفاده کنید.چون این ابزار فقط توابع و عملیات محاسباتی رو پشتیبانی میکنه و اگر در داخل این عملیات کنترلی همچون گرید حضور داشته باشه خطا خواهد داد. شما میتونید قبل و بعد از تابع رنگی کردن یک progress bar رو نمایش و سپس مخفی کنید که کاربر در جریان عملیات قرار بگیره.

پس با این حساب از یه progress bar تو background worker نمی تونم استفاده کنم دیگه؟

ozzy_mra
یک شنبه 30 آبان 1389, 08:15 صبح
progressbar فقط مامور نمایش پیشرفت یک عملیات هست و ربطی به هنگ کردن یا نکردن پروسس نداره .
اگر تعداد رکورد هاتون زیاده باید از thread ها استفاده کنید .
اما اگر تعداد کم هست :


private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
if (dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString() == "a")
dataGridView1.Rows[e.RowIndex].Cells[0].Style.BackColor = Color.Red;
}

(البته کد بالا هم بعد از بایند شدن گرید به صورت اتوماتیک و به تعداد رکورد های دیتاسورس شما فایر میشه)
شاید ایونت بهتری برای اینکار وجود داشته باشه .

موفق باشید .

ممنون برای تعداد رکورد زیاد چطور باید انجام بدم؟
اگه ممکنه یه مثال هم از thread برای بزنید ممنون
من خودم اینجوری انجام دادم

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//progressBar1.Maximum = dataGridView1.Rows.Count;
foreach (DataGridViewRow r in dataGridView1.Rows)
{
// progressBar1.Value += 1;
if (Convert.ToInt32(r.Cells[6].Value) == 1)
{
foreach (DataGridViewCell c in r.Cells)
{
c.Style.BackColor = System.Drawing.Color.MediumAquamarine;
}

}
else if (Convert.ToInt32(r.Cells[6].Value) == 2)
{
foreach (DataGridViewCell c in r.Cells)
{
c.Style.BackColor = System.Drawing.Color.LightSteelBlue;

}
}
else if (Convert.ToInt32(r.Cells[6].Value) == 3)
{
foreach (DataGridViewCell c in r.Cells)
{
c.Style.BackColor = System.Drawing.Color.YellowGreen;
}
}
}
backgroundWorker1.CancelAsync();
}
که بعد از بایند کردن دیتا ست به دیتا گرید بک گراند ورکرو صدا میزنم
خواستم از progressBar هم تو BackGroundWorker استفاده کنم که خطای اینکه دو تا ترد تو هم نمی تونن کار کنن رو داد

M.YasPro
یک شنبه 30 آبان 1389, 08:30 صبح
مدیریت کردن تردها کار آسونی نیست .
شما نمیتونی از آبجکتی که یه ترد دیگه ساخته تو یه ترد دیگه استفاده کنی .
اینجا (http://barnamenevis.org/forum/showpost.php?p=336297&postcount=10)و اینجا (http://barnamenevis.org/forum/showpost.php?p=343112&postcount=16)و اینجا (http://barnamenevis.org/forum/showpost.php?p=570873&postcount=102)رو ببینید .

ozzy_mra
یک شنبه 30 آبان 1389, 14:14 عصر
برای اینکه این رنگی شدن سطرها تا اتمام اجرای قبرنامه باقی بمونه باید چکار کنم چون وقتی روی یکی از ستونهای دیتا گرید کلیک می کنم که مثلاً بر اساس همون ستون مرتب کنه رنگ های نا پدید می شوند و یه گرید با سطر های غیر رنگی نمایش داده می شود

hakelberfin
یک شنبه 30 آبان 1389, 16:33 عصر
سلام

private void dataGridViewCost_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (this.dataGridViewCost.Columns[e.ColumnIndex].Name.Trim().Equals("ColumnName"))
{
String stringValue = e.Value as string;
if (stringValue == null)
return;
if (stringValue == "hello")
this.dataGridViewCost.Rows[e.RowIndex].DefaultCellStyle.ForeColor = Color.Red;
}
}

nimaba2005
سه شنبه 22 تیر 1395, 18:35 عصر
سلام دوست من
کد


for (int index = 0; index < this.dataGrd.RowCount; index++)
{
if (this.dataGrd.Rows[index].Cells["name Field"].Value.ToString() == "مقدار")
this.dataGrd.Rows[indexer].DefaultCellStyle.BackColor = Color.Red;
}





سلام
خط اول داخل حلقه this.dataGrd.RowCount -1 باید باشه چون از صفر شروع میشه -1 باید باشه
و اینکه شمارنده حلفه یک حرفی باشه صحیح تره

milijj
سه شنبه 22 تیر 1395, 19:13 عصر
اقا کافیه رکورد ها به صورت خط به خط و نه کلی داخل گرید بریزید تا اوکی بشه