цвет всей строки вместо одной ячейки

Я пытался изменить цвет фона строки в Compact Framework DataGrid и добился небольшого успеха, поскольку DataGrid в .NET CF ограничен по сравнению с аналогом Windows Forms. Мой единственный успех в достижении моей цели - теперь я могу изменить цвет фонаодиночная клетка в зависимости от его значений. Я не мог манипулировать кодом, который я получил от Googling, так как я не очень хорош в C #. Тем не менее, это код, который у меня есть:

namespace GridColor
{
    public delegate void CheckCellEventHandler(object sender, DataGridEnableEventArgs e);

    public class DataGridEnableEventArgs : EventArgs
    {
        private int _column;
        private int _row;
        private bool _meetsCriteria;

        public DataGridEnableEventArgs(int row, int col, bool val)
        {
            _row = row;
            _column = col;
            _meetsCriteria = val;
        }

        public int Column
        {
            get { return _column; }
            set { _column = value; }
        }

        public int Row
        {
            get { return _row; }
            set { _row = value; }
        }

        public bool MeetsCriteria
        {
            get { return _meetsCriteria; }
            set { _meetsCriteria = value; }
        }

    }

    public partial class ColumnStyle : DataGridTextBoxColumn
    {
        //public event CheckCellEventHandler CheckCellEquals;
        public event CheckCellEventHandler CheckCellContains;

        private int _col;

        public ColumnStyle(int column)
        {
            _col = column;
        }

        protected override void Paint(Graphics g, Rectangle Bounds, CurrencyManager Source, int RowNum, Brush BackBrush, Brush ForeBrush, bool AlignToRight)
        {
            bool enabled = true;

            if (CheckCellContains != null)
            {
                DataGridEnableEventArgs e = new DataGridEnableEventArgs(RowNum, _col, enabled);
                CheckCellContains(this, e);
                if (e.MeetsCriteria)
                    //g.DrawRectangle(new Pen(Color.Red, 2), Bounds.Y + 1, Bounds.Width - 2, Bounds.Height - 2);
                    BackBrush = new SolidBrush(Color.PaleGreen);
            }

            base.Paint(g, Bounds, Source, RowNum, BackBrush, ForeBrush, AlignToRight);

        }
    }

}

Теперь для моей формы, у меня есть это:

namespace GridColor
    {
        public partial class Form1 : Form
        {
            DataSet ds;
            SqlDataAdapter da;
            private List compareValues = new List();

            public Form1()
            {
                InitializeComponent();
                try
                {
                    addGridStyle(ref dataGrid1);
                    compareValues.Add("OK");
                    compareValues.Add("Filling");
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error: " + ex.ToString());
                }
            }

            private void addGridStyle(ref DataGrid dg)
            {
                DataGridTableStyle dtStyle = new DataGridTableStyle();
                dtStyle.MappingName = "Test";

                string connString = "Data Source=192.168.2.16,1433;Initial Catalog=TestDB;User ID=sa;Password=ABC12abc;";
                SqlConnection conn = new SqlConnection(connString);
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "SELECT * FROM Test";
                ds = new DataSet();
                da = new SqlDataAdapter(cmd);
                da.Fill(ds, "Test");

                for (int i = 0; i < ds.Tables["Test"].Columns.Count; i++)
                {
                    ColumnStyle myStyle = new ColumnStyle(i);
                    myStyle.MappingName = ds.Tables["Test"].Columns[i].ToString();
                    if (i == 1)
                    {
                        if (ds.Tables["Test"].Columns[i].DataType == System.Type.GetType("System.String"))
                            myStyle.CheckCellContains += new CheckCellEventHandler(myStyle_CheckCellContains);
                    }
                    dtStyle.GridColumnStyles.Add(myStyle);
                }

                dg.TableStyles.Add(dtStyle);
            }

            public void myStyle_CheckCellContains(object sender, DataGridEnableEventArgs e)
            {
                try
                {
                    if (compareValues.Contains((string)dataGrid1[e.Row, e.Column]))
                        e.MeetsCriteria = true;
                    else
                        e.MeetsCriteria = false;
                }
                catch (Exception ex)
                {
                    e.MeetsCriteria = false;
                }
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                dataGrid1.DataSource = ds.Tables["Test"];
            }
        }
    }

В какой части моего кода я должен измениться так, чтобы, если ячейка соответствует критериям, вся ее строка будет окрашена, а не только она »собственная клетка?

 Alan16 окт. 2012 г., 17:11
я сделал именно эту вещь, я верю, но, к сожалению, сейчас у меня нет доступа к коду. Может быть, сегодня вечером я смогу найти это для тебя.
 Alan16 окт. 2012 г., 17:14
Я сделал что-то подобное, я думаю, что у меня было пользовательское событие, которое было запущено, я обработал событие, а затем использовал аргументы, заполненные правильной кистью. Может случиться так, что каждый столбец должен быть вашего пользовательского типа и просто запускать много событий. Опять .. япосмотрим, смогу ли я найти его
 Yatrix16 окт. 2012 г., 08:38
Рад это слышать.
 Little Tiny Dev17 окт. 2012 г., 07:08
Благодарю. На самом деле я думал об определении значения ячейки и, если оно соответствует критериям, думаю, я запустил бы что-нибудь, чтобы покрасить ячейку для каждого столбца.

Ответы на вопрос(2)

У меня нетя не работал с CF, но я подумал, что выкину это туда ... Если ты сможешь получить доступ к камере, небудь тоNamingContainer? Если это так, вы можете перейти к строке и применить стиль или добавить атрибут с классом CSS.

 CoderMarkus16 окт. 2012 г., 08:48
Можно'ты бросил клеткиNamingContainer как строка, а затем запустить логику против этого объекта?
 CoderMarkus16 окт. 2012 г., 10:54
Моя вина. Я не'не понимаю, что это было специфично для пространства имен System.Web.UI. В CF все еще есть контрольное дерево, верно? Должен быть какой-то способ пройти через это.
 Little Tiny Dev16 окт. 2012 г., 08:47
ну, я уже могу получить доступ / идентифицировать ячейку, если она соответствует критериям. Теперь моя проблема в том, как мне раскрасить весь ряд, а не только одну ячейку.
 Little Tiny Dev16 окт. 2012 г., 10:40
Я не уверен, о каком NamingContainer вы говорите. Я даже проверил документы для .NET и NamingContainer не включен в .NET CF.
Решение Вопроса

Хорошо, я вернулся и нашел свой код много лет назад, где я делал это на рабочем столе, до того, как вышел более продвинутый DataGridView и т. Д.

Прежде всего, это руководство от MicrosoftНастройка сетки данных Windows Forms, который объясняет, как выделить целый ряд.

Я посмотрел на мой код, и мне пришлось добавить собственный стиль столбца длякаждый столбец, запустить событие в главной форме, которую я обработал, а затем определил правильный цвет для этой записи. Затем я устанавливаю свойство args.Color, и DataGridColumn будет рисовать правильный цвет.Так что да, вам нужно, чтобы каждый столбец был вашим настраиваемым форматируемым классом, тогда логика вашего приложения может обработать событие, получить данные записи и определить цвет

** Обновление: здесьпростой пример **

public partial class Form1 : Form
{
    FormattableTextBoxColumn firstNameColumn = new FormattableTextBoxColumn();
    FormattableTextBoxColumn lastNameColumn = new FormattableTextBoxColumn();

    public Form1()
    {
        InitializeComponent();

        // add first name col
        firstNameColumn.MappingName = "FirstName";
        dataGridTableStyle1.GridColumnStyles.Add(firstNameColumn);
        firstNameColumn.SetCellFormat += new FormatCellEventHandler(ColumnSetCellFormat);

        // add last name col
        lastNameColumn.MappingName = "LastName";
        lastNameColumn.SetCellFormat += new FormatCellEventHandler(ColumnSetCellFormat);
        dataGridTableStyle1.GridColumnStyles.Add(lastNameColumn);

        // This just sets up a dummy data source, since I don't have a database in this example
        List peopleList = new List();
        peopleList.Add(new PersonTest
        {
            FirstName = "Alan",
            LastName = "QQQQQ",
            HighlightPerson = true
        });
        peopleList.Add(new PersonTest
        {
            FirstName = "John",
            LastName = "Smith",
            HighlightPerson = false
        });
        BindingSource peopleDataSource = new BindingSource();
        peopleDataSource.DataSource = peopleList;
        dataGridTableStyle1.MappingName = peopleDataSource.GetListName(null);
        dataGrid1.DataSource = peopleDataSource;
    }

    // I'll cache this brush in the form, just make sure to dispose it (see designer.cs disposing)
    SolidBrush highlightBrush = new SolidBrush(Color.Yellow);

    // here is the event you can handle to determine the color of your row!
    private void ColumnSetCellFormat(object sender, DataGridFormatCellEventArgs e)
    {
        if ((e.Source.List[e.Row] as PersonTest).HighlightPerson)
            e.BackBrush = highlightBrush;
    }

    // example test class
    public class PersonTest
    {
        public String FirstName { get; set; }
        public String LastName { get; set; }
        public bool HighlightPerson { get; set; }
    }
}

И пользовательский столбец сетки данных

public class FormattableTextBoxColumn : DataGridTextBoxColumn
{
    public event FormatCellEventHandler SetCellFormat;

    protected override void Paint(Graphics g, Rectangle bounds, CurrencyManager source, int rowNum, Brush backBrush, Brush foreBrush, bool alignToRight)
    {
        DataGridFormatCellEventArgs e = new DataGridFormatCellEventArgs(rowNum, source);
        e.ForeBrush = foreBrush;
        e.BackBrush = backBrush;
        OnSetCellFormat(e);
        base.Paint(g, bounds, source, rowNum, e.BackBrush, e.ForeBrush, alignToRight);
    }

    private void OnSetCellFormat(DataGridFormatCellEventArgs e)
    {
        FormatCellEventHandler handler = SetCellFormat;

        if (handler != null)
            handler(this, e);
    }
}

Вы'Также понадобится этот DataGridCellEventArgs.cs

public delegate void FormatCellEventHandler(object sender, DataGridFormatCellEventArgs e);

public class DataGridFormatCellEventArgs : EventArgs
{
    public int Row;
    public CurrencyManager Source;
    public Brush BackBrush;
    public Brush ForeBrush;

    public DataGridFormatCellEventArgs(int row, CurrencyManager manager)
    {
        this.Row = row;
        this.Source = manager;
    }
}

Вот'Вот пример проекта для вас:

DataGridTest.zip

 Alan28 нояб. 2012 г., 17:28
@jeraldov Хорошо, прости. Мне пришлось внести некоторые изменения, чтобы он работал на CompactFramework. Я обновил свой код и предоставил загружаемый пример проекта, который я протестировал, и он работает. Возможно, вам придется расширить его, чтобы сделать его лучше, но это должно показать подтверждение концепции. наслаждаться
 Little Tiny Dev28 нояб. 2012 г., 11:48
Привет. Не могли бы вы предоставить образец вашего проекта для меня, чтобы попробовать. Я'Мне трудно понять твой вопрос.

Ваш ответ на вопрос