Meriç Kıranoğlu Ответов: 2

Рисование линий с помощью значений из datagridview


У меня есть приложение для windows. [^]

Когда я нажимаю на кнопку вычислить, я делаю некоторые вычисления, используя эти текстовые поля.
с помощью этих вычислений я получаю некоторые значения и записываю их в datagridview [^]

В этот момент мне нужно нарисовать несколько линий, используя те значения, которые в основном являются координатами моих точек..

Некоторые люди сказали мне создать picturebox и создать событие paint.
Поэтому я попробовал это;
Pen myPen = new Pen(Color.Black);

        private void pictureBoxDraw_Paint(object sender, PaintEventArgs e)
        {
            myPen.Width = 2;
            if (binary > 0)
            {
                Point point1 = new Point(10, 20);
                Point point2 = new Point(10, 40);
                e.Graphics.DrawLine(myPen, point1, point2);
            }
            else
            {
            }
        }
      
        private void buttonDraw_Click_1(object sender, EventArgs e)
        {
            binary = 1;
            pictureBoxDraw.Invalidate();
            
        }

        private void buttoncleardraw_Click(object sender, EventArgs e)
        {
            binary = 0;
            pictureBoxDraw.Invalidate();
        }

Когда я изменюсь
Point point1 = new Point(10, 20);
к
Point point1 = new Point(Convert.ToInt32(dataGridViewCrestGeo.Rows[0].Cells[0].Value), Convert.ToInt32(dataGridViewCrestGeo.Rows[0].Cells[0].Value));

Я получаю такое сообщение об ошибке [^]
Мне нужно найти способ нарисовать эти линии, когда я нажимаю на кнопку рисования.

Я инженер-строитель, и все эти вещи действительно сложны для меня. Я был бы признателен за любую помощь. Спасибо.

Что я уже пробовал:

Pen myPen = new Pen(Color.Black);

        private void pictureBoxDraw_Paint(object sender, PaintEventArgs e)
        {
            myPen.Width = 2;
            if (binary > 0)
            {
                Point point1 = new Point(Convert.ToInt32(dataGridViewCrestGeo.Rows[0].Cells[0].Value), Convert.ToInt32(dataGridViewCrestGeo.Rows[0].Cells[0].Value));
                Point point2 = new Point(10, 40);
                e.Graphics.DrawLine(myPen, point1, point2);
            }
            else
            {
            }
        }
      
        private void buttonDraw_Click_1(object sender, EventArgs e)
        {
            binary = 1;
            pictureBoxDraw.Invalidate();
            
        }

        private void buttoncleardraw_Click(object sender, EventArgs e)
        {
            binary = 0;
            pictureBoxDraw.Invalidate();
        }

[no name]

Не знаю, почему это так сложно для вас. Сообщение об ошибке точно сообщает вам, в чем заключается проблема. преобразование.Функция ToInt32 не может преобразовать значения в целые числа, поскольку строки не содержат целочисленных значений.

Meriç Kıranoğlu

ХМ, есть ли способ рисовать без преобразования этих значений в целое число? Например;
стоимость dataGridViewCrestGeo.Строки[0].Ячейки[0].Значение 4.522267. Я могу округлить это значение до 4,52. Могу я его нарисовать?

F-ES Sitecore

попробуйте decimal.Parse(dataGridViewCrestGeo.Rows[0].Ячейки[0].Вместо значение). Вы должны быть осторожны, чтобы у вас не было случайных пробелов, новых строк и т. д., И это значение содержит буквально "4.522267" и ничего больше. Как только это десятичное число, если вам нужно, чтобы оно было int, вы обычно можете привести его

int x = (int)decimalVar;

Это, очевидно, потеряет некоторую точность.

[no name]

4.52 независимо от того, как вы округляете его, это не целое число.

2 Ответов

Рейтинг:
1

Meriç Kıranoğlu

Ладно, каким-то образом мне удалось провести черту. Я оставляю свое решение здесь на случай, если оно кому-то еще понадобится :)

Pen myPen = new Pen(Color.Black);

        private void pictureBoxDraw_Paint(object sender, PaintEventArgs e)
        {
            myPen.Width = 2;
            if (binary > 0)
            {

                float distance1 = float.Parse(dataGridViewCrestGeo.Rows[0].Cells[0].Value.ToString()) * -10;
                float distance2 = float.Parse(dataGridViewCrestGeo.Rows[1].Cells[0].Value.ToString()) * -10;

                float elevation1 = float.Parse(dataGridViewCrestGeo.Rows[0].Cells[1].Value.ToString()) * -10;
                float elevation2 = float.Parse(dataGridViewCrestGeo.Rows[1].Cells[1].Value.ToString()) * -10;
                

                e.Graphics.DrawLine(myPen, distance1, elevation1, distance2, elevation2);
                
             
            }
            else
            {
            }
        }
      
        private void buttonDraw_Click_1(object sender, EventArgs e)
        {
            binary = 1;
            pictureBoxDraw.Invalidate();
            
        }

        private void buttoncleardraw_Click(object sender, EventArgs e)
        {
            binary = 0;
            pictureBoxDraw.Invalidate();
        }


Рейтинг:
0

OriginalGriff

Посмотрите на сообщение об ошибке-оно жалуется не на ничью, а на формат данных, которые вы пытаетесь преобразовать в число. Вот для чего существует FormatException!

Скорее всего, значение в этой конкретной ячейке не то, что вы думаете: это не целое число!
Поэтому извлеките значение в переменную:

object data = dataGridViewCrestGeo.Rows[0].Cells[0].Value;
Поставьте точку останова в строке и запустите свой код в отладчике. когда он доберется туда, он остановится. Один шаг по линии, и посмотрите точно, что находится внутри. data - он скажет вам, на какие данные вы смотрите, и это должно сказать вам, почему он не преобразуется в целое число.
Мы не можем сделать это за вас - у нас нет никакого доступа к вашему DataGridView или содержащимся в нем данным!