从一周开始学习/使用System.Drawing。这对我来说可以。现在我想将数据从表单1 传输到我的第二表单,并希望在加载表单2后在我的表单2 上绘制2个矩形。我该怎么做?
到目前为止我尝试了什么:
调用表单2_Load
onPaint()< - cant transfer Data
事件显示(表单事件) ...
(以下代码仅在我加载表格2后按下第二张表格上的按钮时才有效。)
表单1:
private void btnGo_Click(object sender, EventArgs e)
{
List<string> _basen = new List<string>(); //Add some stuff
_basen.Add("400;200;45");
_basen.Add("400;200;45");
Feld f = new Feld();
this.Hide();
f.transferGameBase(_basen);
f.ShowDialog();
}
表格2:
public void transferGameBase(List<string> infoBase)
{
int count = 0;
foreach(string _base in infoBase)
{
string[] _splitter = infoBase[count].ToString().Split(';');
drawBase(Convert.ToInt16(_splitter[0]), Convert.ToInt16(_splitter[1]), Convert.ToInt16(_splitter[2])); //[0] = x , [1] = y, [2] = size
count++;
}
}
private void drawBase(int x, int y, int size)
{
Graphics g = CreateGraphics();
g.FillRectangle(new SolidBrush(Color.Red), x, y, size, size);
}
感谢您的回答=)!
答案 0 :(得分:1)
试试这个:
public void transferGameBase(List<string> infoBase)
{
int count = 0;
foreach(string _base in infoBase)
{
string[] _splitter = infoBase[count].ToString().Split(';');
drawBase(Convert.ToInt16(_splitter[0]), Convert.ToInt16(_splitter[1]), Convert.ToInt16(_splitter[2])); //[0] = x , [1] = y, [2] = size
count++;
}
this.Invalidate();
}
基本上,窗口只在实际需要时重绘表单,因此当您手动在其上绘制内容时,需要告诉表单重绘自己。
答案 1 :(得分:0)
你甚至可以强制使用你的图形 InvokePaint方法
private void drawBase(int x, int y, int size)
{
Graphics g = CreateGraphics();
g.FillRectangle(new SolidBrush(Color.Red), x, y, size, size);
this.InvokePaint(this, new PaintEventArgs(g, this.Bounds));
}
但由于图形是在显示对象之前创建的,因此仍然无法执行任何操作,并且不是您想要的。
您应该将矩形添加到表单上的变量并处理Paint事件中的变量。