Я пытаюсь сделать снимок экрана с панели, на которой я нарисовал несколько горизонтальных линий.
Я использовал этот код:
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
//hide close button
pictureBox1.Visible = false;
//Take screenshoot for the DPanel.
Bitmap dend = new Bitmap(dPanel.Width, dPanel.Height);
Graphics G = Graphics.FromImage(dend);
System.Drawing.Rectangle rectangle = dPanel.RectangleToScreen(dPanel.ClientRectangle);
G.CopyFromScreen(rectangle.Location, System.Drawing.Point.Empty, dPanel.Size);
SomeGlobalVariables.Mygraph = dend;
Reporttoprint r = new Reporttoprint();
r.Show();
}
Когда я щелкнул ссылку linkLabel1, произошло исключение.
кажется, что когда я нажимаю linkLabel1, чтобы выполнить код и сделать снимок из моей панели, действие dPanel_Paint вызывается снова, после чего запускается исключение!
Исключение в этом регионе:
private void dPanel_Paint(object sender, PaintEventArgs e)
{
if (k==0)
{
//add the "Group" center point to the dictionary.
ClusterPoint=new Point(((ep1.X+ep2.X)/2),((ep1.Y+ep2.Y)/2));
//Exception is done here
clusterpoints.Add(Clusterchar[k], ClusterPoint);
}
}
любая помощь Заранее спасибо.
поэтому найдите, где вы вставляете дважды, и если все, что вы вставляете, уже есть, используйте это, чтобы знать, что вы рекурсивно
Чтобы сохранить графику, нарисованную на Panel, в событии Paint, используйте panel.DrawToBitmap!
Событие Paint () при подписке возникает каждый раз, когда элементу управления необходимо перерисовать себя (возможно, когда Reporttoprint
отображается поверх вашей панели). Некоторые условия не меняются, и в итоге вы дважды добавляете один и тот же ключ в Словарь. Кроме того, вы можете воспользоваться советом TaW и использовать .DrawToBitmap
для рисования поверхности вашей панели в растровое изображение (и удаления объектов, которые вы создаете в процессе).
Событие Paint предназначено для рисования. Похоже на ты не рисуешь в событии Paint ..?!?!?! - Исключение очевидно; никогда не добавляйте в словарь без проверки ключа! Но: Что ты там вообще делаешь ??
Во-первых, событие рисования срабатывает очень и очень часто (в зависимости от обстоятельств).
Проблема в том, что у вас есть повторяющиеся ключи. Два решения.
Перезаписать существующую пару ключ / значение:
clusterpoints[Clusterchar[k]] = ClusterPoint;
Или вообще не добавляйте, если ключ уже существует:
var key = Clusterchar[k];
if (!clusterpoints.ContainsKey(key))
clusterpoints.Add(key, ClusterPoint);
Спасибо, работает ^^
В какой строке выбрасывается исключение?