GMap.NET 和多边形名称未从第二种形式传递
GMap.NET and polygon names not getting passed from second form
所以基本上我正在尝试使用从 Form2 输入的名称制作多边形,称为 Apgabala_nosaukums(这是我的语言,对此感到抱歉)。我一直在尝试对此进行调试,前 2 次确实读取了从 Form2 输入的名称,并且我能够看到该名称已添加到多边形中。但现在它不再进入 fromVisibleChanged,以多边形未命名而告终。这意味着我无法使布尔值变为真,因此我可以添加 4 个点并从中创建一个正方形或矩形区域。有任何想法吗?基本上 btnAdd_Click 功能无法正常工作,其余工作正常。有什么想法吗?
Form1(主窗体):
namespace GMapTest
{
public partial class Form1 : Form
{
GMapOverlay polygons = new GMapOverlay("polygons");
List<PointLatLng> points = new List<PointLatLng>();
double lat;
double lng;
int clicks = 0;
bool add = false;
string nosaukums;
public Form1()
{
InitializeComponent();
}
private void gMapControl1_Load(object sender, EventArgs e)
{
gmap.MapProvider = GoogleMapProvider.Instance;
GMaps.Instance.Mode = AccessMode.ServerOnly;
gmap.SetPositionByKeywords("Riga, Latvia");
gmap.ShowCenter = false;
gmap.Overlays.Add(polygons);
}
private void gmap_MouseDown(object sender, MouseEventArgs e)
{
if (add == true)
{
if (e.Button == MouseButtons.Left)
{
lat = gmap.FromLocalToLatLng(e.X, e.Y).Lat;
lng = gmap.FromLocalToLatLng(e.X, e.Y).Lng;
clicks += 1;
points.Add(new PointLatLng(lat, lng));
}
if (clicks == 4)
{
GMapPolygon polygon = new GMapPolygon(points, nosaukums);
polygons.Polygons.Add(polygon);
clicks = 0;
points.Clear();
add = false;
}
}
}
private void btnAdd_Click(object sender, EventArgs e)
{
Apgabala_nosaukums addName = new Apgabala_nosaukums();
addName.ShowDialog();
addName.VisibleChanged += formVisibleChanged;
if (nosaukums != null)
{
this.add = true;
}
}
private void formVisibleChanged(object sender, EventArgs e)
{
Apgabala_nosaukums frm = (Apgabala_nosaukums)sender;
if (!frm.Visible)
{
this.nosaukums = (frm.ReturnText);
frm.Dispose();
}
}
}
}
Form2 (Apgabala_nosaukums):
namespace GMapTest
{
public partial class Apgabala_nosaukums : Form
{
public string ReturnText { get; set; }
public Apgabala_nosaukums()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.ReturnText = this.txtName.Text;
this.Visible = false;
}
}
}
问题出在您的 btnAdd_Click
函数中。当您调用 ShowDialog
时,会显示您的其他表单,而下一行 addName.VisibleChanged += formVisibleChanged;
在您关闭新表单之前不会被调用。 ShowDialog
以模态方式显示表单,在关闭新表单之前无法与父级交互。
有几种方法可以解决这个问题。
1) 在显示表单之前订阅 VisibleChanged
事件,
addName.VisibleChanged += formVisibleChanged;
addName.ShowDialog();
2) 调用 addName.Show()
而不是 addName.ShowDialog()
。这以非模态方式显示表单。该事件将被订阅,因为在新表单关闭之前 btnAdd_Click
中继续执行。但是,父表单将是可交互的,不确定是否需要这样做。
3) 您也可以摆脱 VisibleChanged
事件内容,而是执行 ShowDialog
并在之后阅读 属性。这是我从代码中推荐的。
private void btnAdd_Click(object sender, EventArgs e)
{
Apgabala_nosaukums addName = new Apgabala_nosaukums();
addName.ShowDialog();
this.nosaukums = addName.ReturnText;
addName.Dispose();
}
所以基本上我正在尝试使用从 Form2 输入的名称制作多边形,称为 Apgabala_nosaukums(这是我的语言,对此感到抱歉)。我一直在尝试对此进行调试,前 2 次确实读取了从 Form2 输入的名称,并且我能够看到该名称已添加到多边形中。但现在它不再进入 fromVisibleChanged,以多边形未命名而告终。这意味着我无法使布尔值变为真,因此我可以添加 4 个点并从中创建一个正方形或矩形区域。有任何想法吗?基本上 btnAdd_Click 功能无法正常工作,其余工作正常。有什么想法吗?
Form1(主窗体):
namespace GMapTest
{
public partial class Form1 : Form
{
GMapOverlay polygons = new GMapOverlay("polygons");
List<PointLatLng> points = new List<PointLatLng>();
double lat;
double lng;
int clicks = 0;
bool add = false;
string nosaukums;
public Form1()
{
InitializeComponent();
}
private void gMapControl1_Load(object sender, EventArgs e)
{
gmap.MapProvider = GoogleMapProvider.Instance;
GMaps.Instance.Mode = AccessMode.ServerOnly;
gmap.SetPositionByKeywords("Riga, Latvia");
gmap.ShowCenter = false;
gmap.Overlays.Add(polygons);
}
private void gmap_MouseDown(object sender, MouseEventArgs e)
{
if (add == true)
{
if (e.Button == MouseButtons.Left)
{
lat = gmap.FromLocalToLatLng(e.X, e.Y).Lat;
lng = gmap.FromLocalToLatLng(e.X, e.Y).Lng;
clicks += 1;
points.Add(new PointLatLng(lat, lng));
}
if (clicks == 4)
{
GMapPolygon polygon = new GMapPolygon(points, nosaukums);
polygons.Polygons.Add(polygon);
clicks = 0;
points.Clear();
add = false;
}
}
}
private void btnAdd_Click(object sender, EventArgs e)
{
Apgabala_nosaukums addName = new Apgabala_nosaukums();
addName.ShowDialog();
addName.VisibleChanged += formVisibleChanged;
if (nosaukums != null)
{
this.add = true;
}
}
private void formVisibleChanged(object sender, EventArgs e)
{
Apgabala_nosaukums frm = (Apgabala_nosaukums)sender;
if (!frm.Visible)
{
this.nosaukums = (frm.ReturnText);
frm.Dispose();
}
}
}
}
Form2 (Apgabala_nosaukums):
namespace GMapTest
{
public partial class Apgabala_nosaukums : Form
{
public string ReturnText { get; set; }
public Apgabala_nosaukums()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.ReturnText = this.txtName.Text;
this.Visible = false;
}
}
}
问题出在您的 btnAdd_Click
函数中。当您调用 ShowDialog
时,会显示您的其他表单,而下一行 addName.VisibleChanged += formVisibleChanged;
在您关闭新表单之前不会被调用。 ShowDialog
以模态方式显示表单,在关闭新表单之前无法与父级交互。
有几种方法可以解决这个问题。
1) 在显示表单之前订阅 VisibleChanged
事件,
addName.VisibleChanged += formVisibleChanged;
addName.ShowDialog();
2) 调用 addName.Show()
而不是 addName.ShowDialog()
。这以非模态方式显示表单。该事件将被订阅,因为在新表单关闭之前 btnAdd_Click
中继续执行。但是,父表单将是可交互的,不确定是否需要这样做。
3) 您也可以摆脱 VisibleChanged
事件内容,而是执行 ShowDialog
并在之后阅读 属性。这是我从代码中推荐的。
private void btnAdd_Click(object sender, EventArgs e)
{
Apgabala_nosaukums addName = new Apgabala_nosaukums();
addName.ShowDialog();
this.nosaukums = addName.ReturnText;
addName.Dispose();
}