কিভাবে ডেটাগ্রিডভিউতে সারি রঙ পরিবর্তন করবেন?


143

আমি আমার ডেটাগ্রিডভিউতে একটি নির্দিষ্ট সারির রঙ পরিবর্তন করতে চাই। কলম্বেন্সেল of এর মান কলম্বেন্সেলের মানের চেয়ে কম হলে সারিটি লালতে পরিবর্তন করা উচিত 10 এটি কীভাবে সম্পাদন করতে হবে তার সম্পর্কে কোনও পরামর্শ?

উত্তর:


192

আপনাকে ডাটাগ্রিডভিউতে সারিগুলি দিয়ে লুপ করতে হবে এবং তারপরে প্রতিটি সারিতে 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; 
     }

1
রিকার্ডো সহায়তার জন্য আপনাকে ধন্যবাদ। আপনার প্রস্তাবিত কোডটি আমি চেষ্টা করেছি। আমি এখনও এটি কাজ করতে পারি না। আপনি কি এই কোডটি একবার খেয়াল করতে পারেন এবং আমাকে বলবেন আমি কোথায় ভুল করেছি? আমি একটি সি সি ছাত্র। আমি নিশ্চিত যে আমি কেবল তুলনা কোডটি সঠিকভাবে লিখিনি। ফরচ (ডেটাগ্রিডভিউ সারি বিক্রেতাদের মধ্যে ডেটাগ্রিডভিউ.রোজে) {যদি (সারি.সেলস [7]। মূল্য হ'ল <সারি। সেলস [10] .ভ্যালু) {ডেটাগ্রিডভিউটেক্সটবক্সক্লোনমাম.ডাফল্টসেলসটিল.ব্যাক কালার = লাল; } } আমি তোমার সাহায্য কে সাধুবাদ জানাই. EB
EB।

আপনার দেওয়া কোডের ভিত্তিতে আমি আপনাকে নতুন কোড যুক্ত করেছি। আপনার সিনট্যাক্সটি কিছুটা বন্ধ ছিল, আমি উপরে উপরে যুক্ত কোডটি ব্যবহার করে দেখুন try
রিকার্ডো সানচেজ

2
রিকার্ডো। আমি টেক্সটকে .value এ পরিবর্তন করে DefaultCellstyle.Backcolor = color.red এ পরিবর্তন করেছি এবং কোডটি কাজ করেছে !!! সময় দেয়ার জন্য ধন্যবাদ! EB
EB।

60

আমি এই সমস্যাটি খতিয়ে দেখছিলাম (তাই আমি জানি এই প্রশ্নটি প্রায় 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;
    }
}

3
আমি সত্যিই পছন্দ করি যে আপনি কীভাবে সমস্যাটি আঁকেন তার পরিবর্তে সবকিছু আঁকার পরে অপেক্ষা না করে। এটি খুব "বাক্সের বাইরে" পদ্ধতির। বেশিরভাগ লোকেরা বরং প্রতিটি সারিটি আবার লুপ করতে
চাইবে

আরও দ্রুত হওয়ার পরে এটি সঠিক সময়ে এটি করতে সহায়তা করে। আমার সারিগুলি রঙিন না হওয়া নিয়ে আমার সমস্যা ছিল, সম্ভবত কারণ আমি ভুল সময়ে রঙ সেট করেছি। এই পদ্ধতির সাথে এটি সঠিক সময়ে হওয়ার নিশ্চয়তা দেয়।
saenderd17

1
এটি গিট কাজ করে। এছাড়াও এর রিফ্রেশ সঠিকভাবে সাজানোর পরে।
ম্যাকমুড়ি

24

আপনি CellFormattingইভেন্টটি সন্ধান করছেন।
এখানে একটি উদাহরণ।


2
এই পদ্ধতির সাথে পার্থক্য হ'ল প্রতিটি একক সেল কেবল একটির বিপরীতে তুলনা করা হবে। আপনার বেশ কয়েক'শ কোষ থাকলে এটি পারফরম্যান্সের সমস্যা হতে পারে।
রিকার্ডো সানচেজ

21

পাশাপাশি পাঠ্যের রঙ পরিবর্তন করতেও আমার সমস্যা হয়েছিল - আমি কখনই রঙ পরিবর্তন করতে দেখিনি।

আমি ইভেন্টটির DataBindingsCompleteজন্য পাঠ্যের রঙ পরিবর্তন করার জন্য কোডটি যুক্ত না করা পর্যন্তDataGridView । এর পরে এটি কাজ করে।

আমি আশা করি এটি একই সমস্যাগুলির মুখোমুখি লোকদের সহায়তা করবে।


অন্লোড (..) ওভাররাইড বা ইভেন্টে প্রবেশের সময় পাঠ্য কাউলর পরিবর্তন হয় না। সারিগুলির রঙিন সেটিং করার জন্য ডেটাবাইন্ডিংস কমপ্লিটটি আরও ভাল জায়গা।
টিমোথি

13

নিম্নলিখিতগুলির মতো কিছু ... কোষের মানগুলি ধরে নেওয়া হচ্ছে পূর্ণসংখ্যা।

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;
}

আপনার সাহায্যের জন্য ধন্যবাদ। আপনার পরামর্শটি সমস্যাটি সমাধানের জন্য আমি যে নিকটে এসেছি is তবে আমি "ভ্যালু" প্রসঙ্গে নেই বা "সেল" প্রসঙ্গে নেই বলে এই ত্রুটিটি পেয়েছি। এটি বের করার চেষ্টা করা হচ্ছে ...
ইবি।

কোডের এই লাইন (dgvr.Cells []]। মান <dgvr.Cells [10]। মূল্য) আমাকে এই ত্রুটি দেয় অপারেটর '<' টাইপ 'অবজেক্ট' এবং 'অবজেক্ট'
EB এর

তখন তাদের পূর্ণসংখ্যায় কাস্ট করুন। :-) এর মতো কিছু: কনভার্ট.টওআইন্ট 32 (ডিভিজিআর সেলস [7]। মূল্য) <কনভার্ট.টোইন্ট 32 (ডিজিভিআর সেলস [10]। ভ্যালু)
ডেমি

8

কিছু মানুষ ব্যবহার করতে চান Paint, CellPaintingবা CellFormattingঘটনা, কিন্তু মনে রাখবেন যে এই ঘটনা একটি শৈলী পরিবর্তন recursive কল ঘটায়। আপনি যদি DataBindingCompleteএটি ব্যবহার করেন তবে কেবল একবার কার্যকর করা হবে। এর পক্ষে যুক্তিটি CellFormattingহ'ল এটিকে কেবল দৃশ্যমান কোষগুলিতে ডাকা হয়, সুতরাং আপনাকে অ-দৃশ্যমান কক্ষগুলি ফর্ম্যাট করতে হবে না, তবে আপনি সেগুলি একাধিকবার বিন্যাস করতে পারেন।


5

আপনি 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;
    }
}

3
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;                   
    //    }
    //}
}

2

বাঁধাইডাটা সোর্স সহ ডেটাগ্রিডভিউতে রঙ পরিবর্তন করার জন্য এটিই আমার সমাধান:

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;
                }
            }

        }

    }
}

1

আপনি যদি কংক্রিট অবজেক্টগুলির একটি (সংগ্রহ) বেঁধে রাখেন তবে সারিটির ডেটাবাউন্ড আইটেম বৈশিষ্ট্যের মাধ্যমে আপনি সেই কংক্রিটের অবজেক্টটি পেতে পারেন। (কক্ষে যাদু স্ট্রিংগুলি পরীক্ষা করা এবং অবজেক্টের "প্রকৃত" বৈশিষ্ট্যগুলি ব্যবহার করা এড়াতে)

কঙ্কালের উদাহরণ নীচে:

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;
            }
        }

0

আমি সাধারণত গ্রিডভিউ.রোউডাটাবাউন্ড ইভেন্ট ইভেন্টটি এর জন্য ব্যবহার করতে চাই।

protected void OrdersGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.ForeColor = System.Drawing.Color.Red;
    }
}

1
তাকে উইন্ডো অ্যাপ্লিকেশন-এ ডেটাগ্রিডভিউয়ের জন্য জিজ্ঞাসা করা হয়েছে। এবং আপনার উত্তরটি ওয়েবের গ্রিডভিউ সম্পর্কে।
প্রতীক 1020

0

ভিসুয়াল স্টুডিও 2010 (আমি এটা চেষ্টা এবং এটি কাজ করে!) উপর কাজ করে এটা আপনার সমগ্র সারি ছবি আঁকবে।

  1. এর জন্য একটি বোতাম তৈরি করুন datagridview
  2. একটি CellClickইভেন্ট তৈরি করুন এবং এর ভিতরে কোডের পরবর্তী লাইনটি রাখুন।

if (dataGridView3.Columns[e.ColumnIndex].Index.Equals(0)    
{
    dataGridView3.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige;
}

0

কীভাবে মান পরিবর্তন হয় তা আপনি উল্লেখ করেননি। যখন ব্যবহারকারী মান প্রবেশ করায় আমি অনুরূপ কার্যকারিতা ব্যবহার করেছি। যেমন সম্পাদনা মোডে প্রবেশ এবং ছেড়ে যাওয়া 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";
        }
    }                               
}

আপনি একইভাবে ত্রুটি বিজ্ঞপ্তি সাফ করার জন্য যুক্তি যুক্ত করতে পারেন।

যদি আপনার ক্ষেত্রে, যদি ডেটা প্রোগ্রামগতভাবে লোড হয়, তবে সেললিভ ইভেন্টটি একই কোড দিয়ে ব্যবহার করা যেতে পারে।


0

এই কোডের সাহায্যে আপনি কেবল সারিগুলি ব্যাককালার পরিবর্তন করেন যেখানে কলামনাম মানটি অন্য সারিগুলির শূন্য হয় তবুও ডিফল্ট রঙ।

       foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    if (row.Cells["columnname"].Value != null)
                    {
                        dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.MistyRose;
                    }
                 }

0

সেটিং সম্পর্কে কেবল একটি নোট DefaultCellStyle.BackColor... আপনি এটিকে বাদ দিয়ে কোনও স্বচ্ছ মানতে সেট করতে পারবেন না Color.Empty। এটি ডিফল্ট মান। এটি মিথ্যাভাবে বোঝায় (আমার কাছে, যাইহোক) স্বচ্ছ রঙগুলি ঠিক আছে। তারা না. আমি প্রতিটি সারি একটি স্বচ্ছ রঙে সেট করেছি কেবল নির্বাচিত-সারিগুলির রঙ আঁকছি।

আমি এই সমস্যাটি নিয়ে প্রাচীরের বিরুদ্ধে আমার মাথা পিটিয়ে পুরোপুরি অনেক বেশি সময় ব্যয় করেছি।


0

আমি এখানে মামলার সমাধানের সন্ধানে অবতরণ করেছি যেখানে আমি ডেটা বাইন্ডিং ব্যবহার করি না। আমার পক্ষে কিছুই কাজ করেনি তবে শেষ পর্যন্ত এটি পেয়েছি:

dataGridView.Columns.Clear(); 
dataGridView.Rows.Clear();
dataGridView.Refresh();

0

আপনি যদি গ্রহের দ্বিতীয় dumbest বিকাশকারী হন (আমাকে dumbest হচ্ছে), উপরের সমস্ত সমাধানগুলি কাজ করে বলে মনে হচ্ছে: সেল ফরম্যাট, ডেটাসোর্স চেঞ্জড এবং রোপ্রেপেন্ট t আমি রওপ্রেপেন্টকে পছন্দ করি।

আমি এটির সাথে লড়াই করেছি (অনেক দীর্ঘ পথের জন্য) কারণ আমি নির্বাচিত সারিটি পরিবর্তন করার সাথে সাথে আমার ব্যাককালার এবং ফোরকালারের পরিবর্তে আমার সিলেশনব্যাক কালার এবং সিলেকশনফোরকলার ওভাররাইড করা দরকার।


0
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;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.