2017-02-22 20 views
1

Я делаю приложение, где мне нужно рисовать вещи на панели. Я составил список «Эллипсис» и нарисовал Эллипсис на панели.Как получить индекс из списка нарисованных эллипсов на панели и удалить эллипс?

Допустим, у меня есть 10 Эллипсис, нарисованных на панели, и я хочу удалить 5-й. Как мне это сделать?

Для каждого эллипса я сделал прямоугольник за ним, чтобы я мог щелкнуть по нему.

Я знаю, что существует метод, называемый: list1.RemoveAt() ". Проблема здесь в том, что я не знаю индекс списка. Как найти индекс эллипса при нажатии на него?

Или не следует использовать list1.removeAt()?

это код:

private void panelUseCase_MouseClick(object sender, MouseEventArgs e) 
{ 
    x = e.X; 
    y = e.Y; 
    else if (rbUseCases.Checked && radioTest.Checked) 
    { 
     foreach (UseCase usecase in usecases) 
     { 

      if (x >= usecase.Field.Left && x <= usecase.Field.Right && y >= usecase.Field.Top && y <= usecase.Field.Bottom) 
      { 
       int bla = usecases.IndexOf(usecase); 
       drawuc.RemoveAt(bla); 
       panelUseCase.Invalidate(); 
      } 
     } 
    } 
} 

Переменная usecase в этом случае эллипс. Это последнее утверждение if из моего метода panelUseCase_MouseClick. Как вы можете видеть, у меня есть drawuc.RemoveAt(). Тем не менее я должен установить индекс между(). Но я не знаю индекс, и я хочу получить индекс, нажав на usecase. Кто-то получил Идею?

+0

Если вы только тест на прямоугольнике почему бы не использовать 'ellips.Contains (Point)'? Для правильного тестирования эллипса вы можете использовать GraphicsPath.IsVisible. См. [Здесь для аналогичного примера] (http://stackoverflow.com/questions/32919918/how-to-draw-line-and-select-it-in-panel/32920894?s=2|0.2144#32920894) - Не рекомендуется, часто запрещать инфузию, изменять список, который вы перечисляете! Реверс для цикла является рекомендуемым способом, как в следующем ответе. - Также: фрагмент кода немного слишком короткий; мы не видим, откуда берутся значения x, y. Показать событие whle! – TaW

+0

Почему я должен использовать ellips.contrains (point)? Я уже проверяю, находится ли прямоугольник за эллипсом. Мне не нужна другая «проверка». И это было слишком сложно с линиями и вещами – Alegou20

+0

Я редактировал все событие! – Alegou20

ответ

0

How do I find the index of an ellipse when clicking on it?

, что будет использовать свой, если условие в методе FindIndex:

int index = usecases.FindIndex(el => 
      x >= el.Field.Left && 
      x <= el.Field.Right && 
      y >= el.Field.Top && 
      y <= el.Field.Bottom 
      ); 

для удаления элемента необходимо установить его в null. Затем вы можете удалить его из своей коллекции и аннулировать свою панель.

if (index >= 0) 
{ 
    usecases[index] = null; 
    usecases.RemoveAt(index); 

    panelUseCase.Invalidate(); 
} 

Вот небольшая программа, которая рисует эллипсы на панели с помощью мыши и удаляет их, когда CheckBoxDelete проверяется. Я пытался подгонять имена к обновленному вашему коду. Это небольшой пример, разделенный на основы, которые (я думаю) вы просили. Вы можете скопировать вставку, скомпилировать и запустить ее в проект WinForms с панелью с именем panelUseCase и флажком с именем checkBoxDelete. Просто добавьте 2 события, и вы готовы к работе.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    List<UseCase> usecases = new List<UseCase>(); 
    int x, y; 
    UseCase _usecase; 

    private void panelUseCase_MouseClick(object sender, MouseEventArgs e) 
    { 
     x = e.X; 
     y = e.Y; 

     if (checkBoxDelete.Checked && usecases.Any()) 
     { 
      int index = usecases.FindIndex(el => 
      x >= el.Field.Left && 
      x <= el.Field.Right && 
      y >= el.Field.Top && 
      y <= el.Field.Bottom 
      ); 

      if (index >= 0) 
      { 
       usecases[index] = null; 
       usecases.RemoveAt(index); 

       panelUseCase.Invalidate(); 
      } 
     } 
     else 
     { 
      if (!String.IsNullOrWhiteSpace(textBoxUseCaseName.Text)) // if name is typed into textbox 
      { 
       _usecase = new UseCase() 
       { 
        Name = textBoxUseCaseName.Text, 
        X = x, 
        Y = y, 
        Field = new Rectangle(x, y, 40, 40) 
       }; 

       usecases.Add(_usecase); 

       panelUseCase.Invalidate(); 
      } 
      else 
      { 
       MessageBox.Show("Need a Name for Usecase!"); 
      } 
     } 
    } 

    private void panelUseCase_Paint(object sender, PaintEventArgs e) 
    { 
     Graphics g = panelUseCase.CreateGraphics(); 
     Pen p = new Pen(Color.Red); 

     foreach (var el in usecases) 
     { 
      g.DrawEllipse(p, el.Field); 
     } 
    } 
} 

Я думаю, вы можете вместить это решение для решения своей проблемы. Надеюсь, это поможет.

пс. Это реализация UseCase класс, который я использовал:

public class UseCase 
{ 
    public string Name { get; set; } 
    public Point MyPoint { get; set; } 
    public Rectangle Field { get; set; } 
    public int X { get; set; } 
    public int Y { get; set; } 

    public UseCase() 
    { 
     MyPoint = new Point(); 
     Field = new Rectangle(); 
    }  
} 
+0

У меня нет кода? у вас есть foreach в сочетании с forloop? – Alegou20

+0

@ Alegou20 lol, извините, скопируйте слишком много: D –

+0

Не работает, Когда я нажимаю эллипс, чтобы удалить его. Это ничего не значит. Похоже, что это только обновление страницы. Но эллипс не уходит. с этим для цикла – Alegou20