winforms, нужна помощь, чтобы создать динамическую табличную панель с кнопками - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь создать динамическую таблицу, которая создает добавляет навык и дает этому уровню навыка 1 уровень и кнопку уменьшения увеличения.Я борюсь с тем, чтобы кнопки получили доступ к метке уровня.Я думал о том, чтобы найти расположение кнопки, на которую нажали, но смог выяснить, как это сделать.

Заранее спасибо.

пример:

1

вот что у меня есть:

        private void skilladded(object sender, EventArgs e)
    {
        int i = 1;
        int[] position= { 0,0};
        bool test = false;
        //string select;
        int k=0;
        for (i=1;i<=skillstableLayoutPanel.RowCount;i++)
        {
            Control c= skillstableLayoutPanel.GetControlFromPosition(0,i);

            if (c!=null&&addskillswin.selected==c.Text)
            {
                test = true;
                k = i;
                break;

            }
            else if(c==null)
            {
                k = i;
                break;
            }
        }

        if (test==false)
        {

            Label newskill = new Label();
            Label newskilllvl = new Label();
            TableLayoutPanel buttontable = new TableLayoutPanel();


            Button up = new Button();
            Button down = new Button();
            buttontable.ColumnCount = 2;
            buttontable.RowCount = 1;
            buttontable.RowStyles.Add(new RowStyle(SizeType.Percent,100f));
            buttontable.ColumnStyles.Add(new ColumnStyle(SizeType.Percent,50f));
            buttontable.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50f));
            buttontable.Margin = new Padding(0,0,0,0);
            buttontable.Dock = DockStyle.Fill;
            buttontable.Controls.Add(up, 0, 0);
            buttontable.Controls.Add(down, 1, 0);
            up.BackgroundImage = Properties.Resources.up;[enter image description here][2]
            down.BackgroundImage = Properties.Resources.down;
            up.BackgroundImageLayout=ImageLayout.Stretch;
            down.BackgroundImageLayout = ImageLayout.Stretch;
            newskill.Text = addskillswin.selected;
            newskilllvl.Text = "1";
            up.Margin = new Padding(0, 0, 0, 0);
            down.Margin = new Padding(0, 0, 0, 0);
            skillstableLayoutPanel.Controls.Add(newskill,0,k);
            skillstableLayoutPanel.Controls.Add(newskilllvl, 1, k);
            skillstableLayoutPanel.Controls.Add(buttontable, 2, k);
            skillavaillabel.Text = (Convert.ToInt32(skillavaillabel.Text) - 1).ToString();
            skillpointlvl = Convert.ToInt32(newskilllvl.Text);

            up.MouseClick += new MouseEventHandler(skillup);                     
            down.MouseClick += new MouseEventHandler(skilldown);


        }
        if (test==true)
        {
            skillstableLayoutPanel.GetControlFromPosition(1, k).Text = (Convert.ToInt32(skillstableLayoutPanel.GetControlFromPosition(1, k).Text) + 1).ToString();
            skillavaillabel.Text = (Convert.ToInt32(skillavaillabel.Text) -1).ToString();
        }

    }
    private void skillup(object sender, EventArgs e)
    {
        skillpointlvl++;

    }
    private void skilldown(object sender, EventArgs e)
    {
        skillpointlvl--;
    }

1 Ответ

0 голосов
/ 01 февраля 2019

Вместо этого:

up.MouseClick += new MouseEventHandler(skillup);                     
down.MouseClick += new MouseEventHandler(skilldown);

Попробуйте что-то вроде этого:

up.MouseClick += ((o, me) =>
{
    int currentLevel = Int32.Parse(newskilllvl.Text);
    currentLevel++;
    newskilllvl.Text = currentLevel.ToString();
});

down.MouseClick += ((o, me) =>
{
    int currentLevel = Int32.Parse(newskilllvl.Text);
    currentLevel--;
    newskilllvl.Text = currentLevel.ToString();
});

Ваш обработчик событий skillup или skilldown потенциально может обработать каждого отправителя и увидеть, от какой кнопкищелчок произошел, но вам нужно было бы уникально назвать каждую кнопку и сделать много сравнений строк, чтобы увидеть, какая кнопка соответствует какой метке уровня навыка.Приведенный выше код добавляет анонимный обработчик к каждой кнопке, что позволяет нам по существу привязать нажатую кнопку к соответствующему ярлыку навыка.

Лично я бы не стал хранить все эти значения в ярлыках, как вы это сделали.Я бы либо сохранил их в свойствах формы, либо, что еще лучше, в своем собственном классе.Я также поместил бы всю эту логику где-нибудь еще рядом с формой, как в Presenter или Controller (или библиотеке классов), и следовал бы шаблону проектирования, такому как MVC или MVP.Это облегчит обслуживание и изменение приложения в долгосрочной перспективе.

Кроме того, рассмотрите возможность использования регистра верблюдов и регистра Паскаля для имен переменных.Опытным программистам сложнее читать все строчные переменные.

...