উত্তর:
আপনাকে ডাটাগ্রিডভিউতে সারিগুলি দিয়ে লুপ করতে হবে এবং তারপরে প্রতিটি সারিতে 7 এবং 10 কলামের মানগুলি তুলনা করতে হবে।
এটা চেষ্টা কর:
foreach (DataGridViewRow row in vendorsDataGridView.Rows)
if (Convert.ToInt32(row.Cells[7].Value) < Convert.ToInt32(row.Cells[10].Value))
{
row.DefaultCellStyle.BackColor = Color.Red;
}
আমি এই সমস্যাটি খতিয়ে দেখছিলাম (তাই আমি জানি এই প্রশ্নটি প্রায় 3 বছর আগে প্রকাশিত হয়েছিল, তবে এটি কারওর পক্ষে সহায়তা করবে ...) তবে মনে হয় যে আরও ভাল বিকল্পটি RowPrePaint
ইভেন্টের ভিতরে কোড স্থাপন করা যাতে আপনি না করেন প্রতি সারিতে অতিক্রম করতে হবে, কেবল যারা আঁকা হয়েছে (তাই এটি প্রচুর পরিমাণে ডেটাতে আরও ভাল সম্পাদন করবে:
ইভেন্ট সংযুক্ত করুন
this.dataGridView1.RowPrePaint
+= new System.Windows.Forms.DataGridViewRowPrePaintEventHandler(
this.dataGridView1_RowPrePaint);
ইভেন্ট কোড
private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
if (Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[7].Text) < Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[10].Text))
{
dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige;
}
}
আপনি CellFormatting
ইভেন্টটি সন্ধান করছেন।
এখানে একটি উদাহরণ।
পাশাপাশি পাঠ্যের রঙ পরিবর্তন করতেও আমার সমস্যা হয়েছিল - আমি কখনই রঙ পরিবর্তন করতে দেখিনি।
আমি ইভেন্টটির DataBindingsComplete
জন্য পাঠ্যের রঙ পরিবর্তন করার জন্য কোডটি যুক্ত না করা পর্যন্তDataGridView
। এর পরে এটি কাজ করে।
আমি আশা করি এটি একই সমস্যাগুলির মুখোমুখি লোকদের সহায়তা করবে।
নিম্নলিখিতগুলির মতো কিছু ... কোষের মানগুলি ধরে নেওয়া হচ্ছে পূর্ণসংখ্যা।
foreach (DataGridViewRow dgvr in myDGV.Rows)
{
if (dgvr.Cells[7].Value < dgvr.Cells[10].Value)
{
dgvr.DefaultCellStyle.ForeColor = Color.Red;
}
}
অরক্ষিত, যাতে কোনও ত্রুটির জন্য ক্ষমা চাই।
যদি আপনি নির্দিষ্ট সারিটি জানেন তবে আপনি পুনরাবৃত্তিটি এড়িয়ে যেতে পারেন:
if (myDGV.Rows[theRowIndex].Cells[7].Value < myDGV.Rows[theRowIndex].Cells[10].Value)
{
dgvr.DefaultCellStyle.ForeColor = Color.Red;
}
কিছু মানুষ ব্যবহার করতে চান Paint
, CellPainting
বা CellFormatting
ঘটনা, কিন্তু মনে রাখবেন যে এই ঘটনা একটি শৈলী পরিবর্তন recursive কল ঘটায়। আপনি যদি DataBindingComplete
এটি ব্যবহার করেন তবে কেবল একবার কার্যকর করা হবে। এর পক্ষে যুক্তিটি CellFormatting
হ'ল এটিকে কেবল দৃশ্যমান কোষগুলিতে ডাকা হয়, সুতরাং আপনাকে অ-দৃশ্যমান কক্ষগুলি ফর্ম্যাট করতে হবে না, তবে আপনি সেগুলি একাধিকবার বিন্যাস করতে পারেন।
আপনি Backcolor
নিজের শর্তটি ব্যবহার করে সারি সারি পরিবর্তন করতে পারেন and Datasource
এবং প্রয়োগ করার পরে এই ফাংশন কলটি DatagridView
।
এখানে তার জন্য ফাংশন। কেবল এটি অনুলিপি করুন এবং এটি পরে রাখুনDatabind
private void ChangeRowColor()
{
for (int i = 0; i < gvItem.Rows.Count; i++)
{
if (BindList[i].MainID == 0 && !BindList[i].SchemeID.HasValue)
gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#C9CADD");
else if (BindList[i].MainID > 0 && !BindList[i].SchemeID.HasValue)
gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#DDC9C9");
else if (BindList[i].MainID > 0)
gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#D5E8D7");
else
gvItem.Rows[i].DefaultCellStyle.BackColor = Color.White;
}
}
private void dtGrdVwRFIDTags_DataSourceChanged(object sender, EventArgs e)
{
dtGrdVwRFIDTags.Refresh();
this.dtGrdVwRFIDTags.Columns[1].Visible = false;
foreach (DataGridViewRow row in this.dtGrdVwRFIDTags.Rows)
{
if (row.Cells["TagStatus"].Value != null
&& row.Cells["TagStatus"].Value.ToString() == "Lost"
|| row.Cells["TagStatus"].Value != null
&& row.Cells["TagStatus"].Value.ToString() == "Damaged"
|| row.Cells["TagStatus"].Value != null
&& row.Cells["TagStatus"].Value.ToString() == "Discarded")
{
row.DefaultCellStyle.BackColor = Color.LightGray;
row.DefaultCellStyle.Font = new Font("Tahoma", 8, FontStyle.Bold);
}
else
{
row.DefaultCellStyle.BackColor = Color.Ivory;
}
}
//for (int i= 0 ; i<dtGrdVwRFIDTags.Rows.Count - 1; i++)
//{
// if (dtGrdVwRFIDTags.Rows[i].Cells[3].Value.ToString() == "Damaged")
// {
// dtGrdVwRFIDTags.Rows[i].Cells["TagStatus"].Style.BackColor = Color.Red;
// }
//}
}
বাঁধাইডাটা সোর্স সহ ডেটাগ্রিডভিউতে রঙ পরিবর্তন করার জন্য এটিই আমার সমাধান:
private void dataGridViewECO_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
if (e.ListChangedType != ListChangedType.ItemDeleted)
{
DataGridViewCellStyle green = this.dataGridViewECO.DefaultCellStyle.Clone();
green.BackColor = Color.Green;
DataGridViewCellStyle gray = this.dataGridViewECO.DefaultCellStyle.Clone();
gray.BackColor = Color.LightGray;
foreach (DataGridViewRow r in this.dataGridViewECO.Rows)
{
if (r.Cells[8].Value != null)
{
String stato = r.Cells[8].Value.ToString();
if (!" Open ".Equals(stato))
{
r.DefaultCellStyle = gray;
}
else
{
r.DefaultCellStyle = green;
}
}
}
}
}
আপনি যদি কংক্রিট অবজেক্টগুলির একটি (সংগ্রহ) বেঁধে রাখেন তবে সারিটির ডেটাবাউন্ড আইটেম বৈশিষ্ট্যের মাধ্যমে আপনি সেই কংক্রিটের অবজেক্টটি পেতে পারেন। (কক্ষে যাদু স্ট্রিংগুলি পরীক্ষা করা এবং অবজেক্টের "প্রকৃত" বৈশিষ্ট্যগুলি ব্যবহার করা এড়াতে)
কঙ্কালের উদাহরণ নীচে:
DTO / Poco
public class Employee
{
public int EmployeeKey {get;set;}
public string LastName {get;set;}
public string FirstName {get;set;}
public bool IsActive {get;set;}
}
ডেটাগ্রিডভিউয়ের সাথে আবদ্ধ
private void BindData(ICollection<Employee> emps)
{
System.ComponentModel.BindingList<Employee> bindList = new System.ComponentModel.BindingList<Employee>(emps.OrderBy(emp => emp.LastName).ThenBy(emp => emp.FirstName).ToList());
this.dgvMyDataGridView.DataSource = bindList;
}
তারপরে ইভেন্ট হ্যান্ডলার এবং কংক্রিট অবজেক্ট (কোনও ডেটাগ্রিডআর এবং / অথবা কোষের পরিবর্তে) পাচ্ছেন
private void dgvMyDataGridView_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
Employee concreteSelectedRowItem = this.dgvMyDataGridView.Rows[e.RowIndex].DataBoundItem as Employee;
if (null != concreteSelectedRowItem && !concreteSelectedRowItem.IsActive)
{
dgvMyDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightGray;
}
}
আমি সাধারণত গ্রিডভিউ.রোউডাটাবাউন্ড ইভেন্ট ইভেন্টটি এর জন্য ব্যবহার করতে চাই।
protected void OrdersGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.ForeColor = System.Drawing.Color.Red;
}
}
ভিসুয়াল স্টুডিও 2010 (আমি এটা চেষ্টা এবং এটি কাজ করে!) উপর কাজ করে এটা আপনার সমগ্র সারি ছবি আঁকবে।
datagridview
।CellClick
ইভেন্ট তৈরি করুন এবং এর ভিতরে কোডের পরবর্তী লাইনটি রাখুন।if (dataGridView3.Columns[e.ColumnIndex].Index.Equals(0)
{
dataGridView3.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige;
}
কীভাবে মান পরিবর্তন হয় তা আপনি উল্লেখ করেননি। যখন ব্যবহারকারী মান প্রবেশ করায় আমি অনুরূপ কার্যকারিতা ব্যবহার করেছি। যেমন সম্পাদনা মোডে প্রবেশ এবং ছেড়ে যাওয়া leaving
ডেটাগ্রিডভিউয়ের সেলঅ্যান্ডএডিট ইভেন্টটি ব্যবহার করে ।
private void dgMapTable_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
double newInteger;
if (double.TryParse(dgMapTable[e.ColumnIndex,e.RowIndex].Value.ToString(), out newInteger)
{
if (newInteger < 0 || newInteger > 50)
{
dgMapTable[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Red;
dgMapTable[e.ColumnIndex, e.RowIndex].ErrorText
= "Keep value in Range:" + "0 to " + "50";
}
}
}
আপনি একইভাবে ত্রুটি বিজ্ঞপ্তি সাফ করার জন্য যুক্তি যুক্ত করতে পারেন।
যদি আপনার ক্ষেত্রে, যদি ডেটা প্রোগ্রামগতভাবে লোড হয়, তবে সেললিভ ইভেন্টটি একই কোড দিয়ে ব্যবহার করা যেতে পারে।
এই কোডের সাহায্যে আপনি কেবল সারিগুলি ব্যাককালার পরিবর্তন করেন যেখানে কলামনাম মানটি অন্য সারিগুলির শূন্য হয় তবুও ডিফল্ট রঙ।
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Cells["columnname"].Value != null)
{
dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.MistyRose;
}
}
সেটিং সম্পর্কে কেবল একটি নোট DefaultCellStyle.BackColor
... আপনি এটিকে বাদ দিয়ে কোনও স্বচ্ছ মানতে সেট করতে পারবেন না Color.Empty
। এটি ডিফল্ট মান। এটি মিথ্যাভাবে বোঝায় (আমার কাছে, যাইহোক) স্বচ্ছ রঙগুলি ঠিক আছে। তারা না. আমি প্রতিটি সারি একটি স্বচ্ছ রঙে সেট করেছি কেবল নির্বাচিত-সারিগুলির রঙ আঁকছি।
আমি এই সমস্যাটি নিয়ে প্রাচীরের বিরুদ্ধে আমার মাথা পিটিয়ে পুরোপুরি অনেক বেশি সময় ব্যয় করেছি।
আমি এখানে মামলার সমাধানের সন্ধানে অবতরণ করেছি যেখানে আমি ডেটা বাইন্ডিং ব্যবহার করি না। আমার পক্ষে কিছুই কাজ করেনি তবে শেষ পর্যন্ত এটি পেয়েছি:
dataGridView.Columns.Clear();
dataGridView.Rows.Clear();
dataGridView.Refresh();
আপনি যদি গ্রহের দ্বিতীয় dumbest বিকাশকারী হন (আমাকে dumbest হচ্ছে), উপরের সমস্ত সমাধানগুলি কাজ করে বলে মনে হচ্ছে: সেল ফরম্যাট, ডেটাসোর্স চেঞ্জড এবং রোপ্রেপেন্ট t আমি রওপ্রেপেন্টকে পছন্দ করি।
আমি এটির সাথে লড়াই করেছি (অনেক দীর্ঘ পথের জন্য) কারণ আমি নির্বাচিত সারিটি পরিবর্তন করার সাথে সাথে আমার ব্যাককালার এবং ফোরকালারের পরিবর্তে আমার সিলেশনব্যাক কালার এবং সিলেকশনফোরকলার ওভাররাইড করা দরকার।
int counter = gridEstimateSales.Rows.Count;
for (int i = 0; i < counter; i++)
{
if (i == counter-1)
{
//this is where your LAST LINE code goes
//row.DefaultCellStyle.BackColor = Color.Yellow;
gridEstimateSales.Rows[i].DefaultCellStyle.BackColor = Color.Red;
}
else
{
//this is your normal code NOT LAST LINE
//row.DefaultCellStyle.BackColor = Color.Red;
gridEstimateSales.Rows[i].DefaultCellStyle.BackColor = Color.White;
}
}