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();
}