Как удалить кнопку добавления во время выполнения? - PullRequest
0 голосов
/ 20 мая 2018

Во-первых, я настоящий новичок в c #, поэтому, пожалуйста, не отвечайте на вопросы экспертов, будьте проще, даже если это более длинный вариант, чем должен быть, спасибо!

Я написал небольшую программу, которая может добавлять в форму так называемые «Заметки» во время выполнения.

Примечание - это класс, который содержит две кнопки (удалить, сохранить) и текстовое поле.Другой класс, MyNotes, имеет метод, который добавляет новые заметки в форму до макс.4.

Пока все работает отлично.

Теперь проблема: я хотел бы удалить конкретную заметку, для которой пользователь нажимает кнопку удаления (поэтому две кнопки и текстовое поле должны быть удалены из формы, но (если есть) другие заметкидолжно остаться нетронутым.

Я уже запрограммировал метод удаления, но проблема в том, что «отправитель объекта» в «remove_Click» действительно доставляет кнопку удаления, но информация о заметке отсутствует, он является частьюили других элементов его Заметки (кнопка «Сохранить», текстовое поле). Я понимаю, почему, но не знаю, как решить проблему.

Как я могу сказать ему, из какой Заметки ончасть?

РЕДАКТИРОВАТЬ: save_Click и button1_Click не являются частью этого, они имеют другие функции, не относящиеся к этому.

EDIT2: Это изображение программы. 4 текстовых поля, кнопки сохраненияи кнопки «X» в верхней части были добавлены «ADD». Проблема состоит в том, чтобы удалить один «Набор нот», нажав «X» в одном из 4 случаев.: - /

Нажмите, чтобы увидеть изображение моего рrogram

Форма:

using System;
using System.Windows;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TextboxTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            richTextBox1.BorderStyle = BorderStyle.None; 
        }

        private void load_Click(object sender, EventArgs e)
        {
            Note note = MyNotes.AddNote();
            if (note !=  null)
            {
                this.Controls.Add(note.GetBox());
                this.Controls.Add(note.GetRemoveButton());
                this.Controls.Add(note.GetSaveButton());

                note.GetRemoveButton().Click += new EventHandler(remove_Click);

            }
            richTextBox1.Text = MyNotes.SetNote();
        }

        private void remove_Click(object sender, EventArgs e)
        {
            Note note = sender as Note;

            Controls.Remove(note.GetBox());
            Controls.Remove(note.GetSaveButton());
            Controls.Remove(note.GetRemoveButton());
        }


        private void save_Click(object sender, EventArgs e)
        {
            String savePath = Properties.Settings.Default.datapath;
            System.IO.File.WriteAllText(savePath, richTextBox1.Text);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 settings = new Form2();
            settings.Show();
            MessageBox.Show("Selected Item Text: " + Properties.Settings.Default.textboxFont + "\n");
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            richTextBox1.Text = MyNotes.SetNote();
        }

    }
}

Класс MyNotes:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TextboxTest
{
    class MyNotes
    {
        public static List<Note> noteList = new List<Note>();
        public static String path = Properties.Settings.Default.datapath;
        private static int y = 50;



        // Adds a new textbox, save- and remove-Button to the form (and the textBoxList) 
        // up to a maximum of 4 each.

        public static Note AddNote()
        {
            if (noteList.Count < 4)
            {
                Note note = new Note();
                note.GetBox().Location = new Point(100, y);
                note.GetRemoveButton().Location = new Point(15, y-2);
                note.GetSaveButton().Location = new Point(40, y - 2);
                y += 22;
                noteList.Add(note);
                return note;
            }
            else
            {
                MessageBox.Show("It's only possible to set a maximum of 4 notes. Please delete or rewrite another one.");
                return null;
            }
        }

        public static String SetNote()
        {
            return System.IO.File.ReadAllText(path);
        }


    }
}

Класс Примечания:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TextboxTest
{
    class Note
    {
        private TextBox box;
        private Button remove;
        private Button save;

        public Note()
        {
            boxSettings();
            removeSettings();
            saveSettings();
        }

        private void boxSettings()
        {
            box = new TextBox();
            box.Width = 250;
            box.BackColor = System.Drawing.Color.DarkGray;

        }

        private void removeSettings()
        {
            remove = new Button();
            remove.Text = "X";
            remove.TextAlign = ContentAlignment.MiddleCenter;
            remove.Width = 20;

        }

        private void saveSettings()
        {
            save = new Button();
            save.Text = "SAVE";
            save.TextAlign = ContentAlignment.MiddleCenter;
            save.Width = 50;

        }

        public TextBox GetBox()
        {
            return this.box;
        }

        public Button GetRemoveButton()
        {
            return this.remove;
        }

        public Button GetSaveButton()
        {
            return this.save;
        }


    }
}

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Спасибо, это отлично работает!:-)

В течение последнего часа я тоже нашел решение.Но это намного сложнее (но, по крайней мере, это сработало ^^ - но я предпочитаю ваш xD).

Это "золотой самородок":

private void remove_Click(object sender, EventArgs e)
        {
            Button button = sender as Button;
            String s = button.Name;
            s = s.Substring(6);
            int index;

            index = Convert.ToInt32(s);
            Note note = MyNotes.noteList.ElementAt(index);

            this.Controls.Remove(note.GetBox());
            this.Controls.Remove(note.GetSaveButton());
            this.Controls.Remove(note.GetRemoveButton());

            MyNotes.noteList.Remove(note);

            int x = MyNotes.noteList.Count;
            MessageBox.Show(x.ToString());

        }
0 голосов
/ 20 мая 2018

В этом случае вы можете использовать свойство тега .Думайте о свойстве Tag (которое имеется в каждом элементе управления) как о заполнителе, который может содержать объект.

В вашем случае, после того, как пользователь нажимает кнопку «X», которую вы хотите удалить, эта проблема заключается в том, чточто в случае нажатия вы получаете саму кнопку, а не заметку.Здесь вы можете сохранить объект Note в своих кнопках, чтобы затем использовать их в событии Click.

Код:

// Class Note
private void removeSettings()
{
    remove = new Button();
    remove.Text = "X";
    remove.TextAlign = ContentAlignment.MiddleCenter;
    remove.Width = 20;
    remove.Tag = this; // Store the current Note in its remove button
}

// Class Form1
private void remove_Click(object sender, EventArgs e)
{
    Button btn = sender as Button;
    Note note = btn.Tag as Note;

    Controls.Remove(note.GetBox());
    Controls.Remove(note.GetSaveButton());
    Controls.Remove(note.GetRemoveButton());
}

Надеюсь, это простодостаточно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...