C# 如何从面板上绘制的椭圆列表中获取索引并删除椭圆?

C# 如何从面板上绘制的椭圆列表中获取索引并删除椭圆?,c#,winforms,indexing,drawing,panel,C#,Winforms,Indexing,Drawing,Panel,我正在制作一个应用程序,我必须在面板上画东西。我列了一张“省略号”的清单,并把省略号画到面板上 假设我在面板上画了10个省略号,我想删除第5个。我该怎么做 对于每个椭圆,我在它后面做了一个矩形,这样我可以点击它 我知道有一个方法叫做:“list1.RemoveAt()”。这里的问题是我不知道列表的索引。单击椭圆时如何找到它的索引 或者我不应该使用list1.removeAt() 代码如下: private void panelUseCase_MouseClick(object sender, M

我正在制作一个应用程序,我必须在面板上画东西。我列了一张“省略号”的清单,并把省略号画到面板上

假设我在面板上画了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();
            }
        }
    }
}
private void panelUseCase\u鼠标单击(对象发送器,鼠标指针)
{
x=e.x;
y=e.y;
else if(rbUseCases.Checked&&radioTest.Checked)
{
foreach(用例中的用例用例)
{
如果(x>=usecase.Field.Left&&x=usecase.Field.Top&&y
单击椭圆时如何找到它的索引

这将使用
FindIndex
方法中的if子句:

int index = usecases.FindIndex(el =>
            x >= el.Field.Left && 
            x <= el.Field.Right && 
            y >= el.Field.Top && 
            y <= el.Field.Bottom
            );
下面是一个小程序,它通过鼠标单击在面板上绘制省略号,并在选中
复选框delete
时将其删除。我尝试将这些名称与您更新的代码相匹配。这是一个小示例,可以简化为(我想)以下的要点您请求了。您可以使用名为
panelUseCase
的面板和名为
checkBoxDelete
的复选框将粘贴、编译并运行到WinForms项目中。只需添加两个事件,即可开始

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);
        }
    }
}
单击椭圆时如何找到它的索引

这将使用
FindIndex
方法中的if子句:

int index = usecases.FindIndex(el =>
            x >= el.Field.Left && 
            x <= el.Field.Right && 
            y >= el.Field.Top && 
            y <= el.Field.Bottom
            );
下面是一个小程序,它通过鼠标单击在面板上绘制省略号,并在选中
复选框delete
时将其删除。我尝试将这些名称与您更新的代码相匹配。这是一个小示例,可以简化为(我想)以下的要点您请求了。您可以使用名为
panelUseCase
的面板和名为
checkBoxDelete
的复选框将粘贴、编译并运行到WinForms项目中。只需添加两个事件,即可开始

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

我不明白你的代码?你有一个foreach和一个forloop?当我按椭圆删除它时,它不工作。它什么也没做。它看起来好像只是刷新页面。但是椭圆不会消失。对于循环,你删除的代码不工作,它什么也没删除:(,还有人有其他想法吗?@Alegou20我发布了一个用于通过鼠标单击绘制和删除省略号的工作代码。我试图将其调整为您更新代码的名称。请看一看。首先感谢您的帮助。但是您发布的代码并不健壮。当您单击2/3次时,它会工作。但是当您绘制20个省略号并希望删除它们应用程序正在崩溃。它会出现以下错误:“索引超出范围。这些索引不能为负数,并且必须小于集合的大小。”我不明白你的代码?你有一个foreach和一个forloop?当我按椭圆删除它时,它不工作。它什么也没做。它看起来好像只是刷新页面。但是椭圆不会消失。对于循环,你删除的代码不工作,它什么也没删除:(,还有人有其他想法吗?@Alegou20我发布了一个用于通过鼠标单击绘制和删除省略号的工作代码。我试图将其调整为您更新代码的名称。请看一看。首先感谢您的帮助。但是您发布的代码并不健壮。当您单击2/3次时,它会工作。但是当您绘制20个省略号并希望删除它们应用程序正在崩溃。它会出现以下错误:“索引超出范围。索引不能为负数,并且必须小于集合的大小。”如果只测试矩形,为什么不使用
ellips.Contains(Point)
?要进行正确的椭圆测试,您可以使用GraphicsPath.IsVisible。请参阅-不建议修改您枚举的集合,事实上通常是禁止的!建议使用反向For循环,如下面的答案所示…-另外:代码段有点太短;我们看不到x,y值来自何处。显示whle事件!为什么我要使用ellips.Contains(点)?我已经在检查矩形是否在椭圆后面。我不需要另一个“检查”的东西..而且线条和内容太复杂了我已经编辑了整个事件!如果你只测试一个矩形为什么不使用
ellips.Contains(点)
?要进行正确的椭圆测试,您可以使用GraphicsPath.IsVisible。请参阅-不建议修改您枚举的集合,事实上通常是禁止的!建议使用反向For循环,如下面的答案所示…-另外:代码段有点太短;我们看不到x,y值来自何处。显示whle事件!为什么我要使用椭圆。矛盾体(点)?我已经在检查矩形是否在椭圆后面。我不需要再做“检查”了。这对线条和内容来说太复杂了。我已经编辑了整个事件!