Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Как выводить матрицу?


Автор: 4YBAK 10.2.2006, 01:54
А как лучше выводить элементы матрицы (тип double) в виндовом приложении?
Может, как-нить в датагрид зафигарить?

Автор: mr.DUDA 10.2.2006, 11:24
Легко:

Код
    /// <summary>
    /// Строка матрицы длиной 3 элемента
    /// </summary>
    public class Matrix3Row
    {
        public double x, y, z;

        public double X
        {
            get {return x;}
            set {x = value;}
        }
        public double Y
        {
            get {return y;}
            set {y = value;}
        }
        public double Z
        {
            get {return z;}
            set {z = value;}
        }
        
        public Matrix3Row(double x, double y, double z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
        }
    }

    public class Form1 : System.Windows.Forms.Form
    {
        protected override void OnLoad(EventArgs e)
        {
            Matrix3Row[] matrix = new Matrix3Row[]
            {
                new Matrix3Row(1, 2, 3),
                new Matrix3Row(4, 5, 6),
                new Matrix3Row(7, 8, 9)
            };

            this.dataGrid1.SetDataBinding(matrix, "");
            
            // сейчас колонки идут в произвольном порядке, поэтому
            // мы заново добавим в грид колонки в порядке "X", "Y", "Z"
            DataGridTableStyle style = new DataGridTableStyle();
            style.MappingName= "Matrix3Row[]";
            DataGridTextBoxColumn xColumn = new DataGridTextBoxColumn();
            DataGridTextBoxColumn yColumn = new DataGridTextBoxColumn();
            DataGridTextBoxColumn zColumn = new DataGridTextBoxColumn();
            xColumn.MappingName= "X";
            xColumn.HeaderText= "X";
            yColumn.MappingName= "Y";
            yColumn.HeaderText= "Y";
            zColumn.MappingName= "Z";
            zColumn.HeaderText= "Z";
            style.GridColumnStyles.Add(xColumn);
            style.GridColumnStyles.Add(yColumn);
            style.GridColumnStyles.Add(zColumn);
            dataGrid1.TableStyles.Clear();
            dataGrid1.TableStyles.Add(style);

            base.OnLoad (e);
        }


Автор: 4YBAK 10.2.2006, 20:55
Почему-то данный код не работает с матрицей типа double[,]
Компилится нормально, но не работает...
Код



private void button1_Click(object sender, System.EventArgs e)

{
            double[,] matrix = new double[3,3]
            {
                {1, 2, 3},
                {4, 5, 6},
                {7, 8, 9},
            };

            this.dataGrid1.SetDataBinding(matrix, "");
}


Кстати, что значит второй параметр в методе SetDataBinding? И чем это метод отличается от свойства DataSource?

з.ы. Как оформлять вывод столбцов в нужном порядке я понял, спасибо!
Теперь надо заставить всё это работать с матрицей double[,]
Возможности делать класс Matrix3Row нет ни малейшей... Матрица double[,] уже готова....

Автор: mr.DUDA 11.2.2006, 10:01
Цитата(4YBAK @ 10.2.2006, 19:55 Найти цитируемый пост)
Кстати, что значит второй параметр в методе SetDataBinding? И чем это метод отличается от свойства DataSource?

Ничем не отличается. Разве что, наполняет грид колонками.
Второй параметр указывает DataMember для DataSource.

Цитата(4YBAK @ 10.2.2006, 19:55 Найти цитируемый пост)
Теперь надо заставить всё это работать с матрицей double[,]
Возможности делать класс Matrix3Row нет ни малейшей... Матрица double[,] уже готова....

Проблема в том, что каждый элемент из DataSource должен быть объектом со свойствами, одно свойство - одна колонка. С массивами, боюсь не получится. Можно поюзать DevExpress-овский грид, там всё более демократично.

Автор: 4YBAK 11.2.2006, 20:52
Цитата(mr.DUDA @ 11.2.2006, 10:01 Найти цитируемый пост)
Можно поюзать DevExpress-овский грид, там всё более демократично.

А где его взять?
А то не прёт выводить матрицу вот так примитивно:


Код

private void button1_Click(object sender, System.EventArgs e)
        {
            double[,] matrix = new double[3,3]
            {
                {1, 2, 3},
                {4, 5, 6},
                {7, 8, 9},
            };
            string s="";

            for(int i=0;i<3;i++)
            {
                for(int j=0;j<3;j++) s+=matrix[i,j].ToString()+ "     ";
                s+="\n";
            }        
                
            MessageBox.Show(s,"matrix");

}



Автор: mr.DUDA 11.2.2006, 22:10
Ну, если так всё обстоит чтобы "просто вывести матрицу", можно и ListBox поюзать, или даже обычный TextBox с Multiline = true

Автор: 4YBAK 12.2.2006, 18:38
Да это понятно, что можно....
Но хоца как-нить покруче вывести... Покрасивее для юзера...
Может, есть компонент, в котором просто пишешь grid[i,j]=matrix[i,j] ?
Или еще лучше grid.datasource=matrix
К тому же мне понадобится определенные строки и столбцы матрицы выделить цветом....

Автор: mr.DUDA 12.2.2006, 22:24
Юзай DevExpress.XtraGrid, и всё у тебя получится.

Автор: 4YBAK 13.2.2006, 17:06
Цитата(mr.DUDA @ 12.2.2006, 22:24 Найти цитируемый пост)
Юзай DevExpress.XtraGrid, и всё у тебя получится.


Где его найти?

Автор: mr.DUDA 13.2.2006, 17:27
Цитата(4YBAK @ 13.2.2006, 16:06 Найти цитируемый пост)
Где его найти?

Был бы он бесплатный - я б тебе скинул не только ссылочку, но и саму дллку smile

Автор: 4YBAK 13.2.2006, 19:05
Цитата(mr.DUDA @ 13.2.2006, 17:27 Найти цитируемый пост)
Был бы он бесплатный - я б тебе скинул не только ссылочку, но и саму дллку


Не жмотись smile Скинь ддлку smile

Автор: mr.DUDA 13.2.2006, 23:13
Вот бери, только здесь без Design-Time.

Автор: 4YBAK 14.2.2006, 01:22
Пасиба!
Скачал, добавил в references проекта....
А че дальше делать - не пойму...
Напиши пример использования, плиз.
Конкретно интересует вывод матрицы double A[,] и покраска любого столбца и любой строки, скажем, в желтый цвет.

Автор: mr.DUDA 14.2.2006, 14:57
Ну добавь на тулбокс компонент DevExpress.XtraGrid.GridControl из дллки DevExpress.XtraGrid, дальше всё будет понятно

Автор: Exception 14.2.2006, 19:15
[offtop]
Он впринципе удобнее и настраиваемее, чем DataGridView, я правильно понял smile ?
[/offtop]
Добавлено @ 19:21
По поводу "просто DataSource = matrix" - в последнем посте темы "Vingrad .NET Framework" я привел класс для такого (хотя не знаю, сработает ли). Тебе нужно будет написать
Код
myGrid.DataSource = DataSetSerializer<double[,]>.Serialize(matrix).Tables[0];

Автор: mr.DUDA 14.2.2006, 21:00
Цитата(Exception @ 14.2.2006, 18:15 Найти цитируемый пост)
Он впринципе удобнее и настраиваемее, чем DataGridView, я правильно понял  ?

Ты понял правильно smile . Раз эдак в 100 удобнее и примерно в 1000 настраиваемее smile

Автор: Exception 15.2.2006, 13:44
Тогда надо поставить smile . DevExpress всегда отличались удобными решениями smile

Автор: 4YBAK 23.2.2006, 21:57
Цитата(Exception @ 14.2.2006, 19:15 Найти цитируемый пост)
По поводу "просто DataSource = matrix" - в последнем посте темы "Vingrad .NET Framework" я привел класс для такого (хотя не знаю, сработает ли).


Не фурычит чего-то....
А можно как-то без этого класса вывести матрицу double[,] на grid?

Автор: mr.DUDA 23.2.2006, 22:45
Замапить двумерный массив на датагрид невозможно.

З.Ы. если кто найдёт способ - добавлю плюс в репу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)