Я могу найти элемент управления по имени, но как мне найти OvalShape по имени

Я пытаюсь выбрать что-то, что не является элементом управления - OvalShape.

Это работает, чтобы найти кнопку

string y = "btn_down_" + x;
Button button = this.Controls.Find(y, true)[0] as Button;

Как я могу сделать то же самое, чтобы найти OvalShape, например: (это не работает, очевидно)

string y = "ovalShape_" + x;
OvalShape light = this.Controls.Find(y, true)[0] as OvalShape;

_____Решение_____

string z = "ovalShape" + (21-x);
OvalShape light = shapeContainer2.Shapes.OfType<OvalShape>().FirstOrDefault(ov =>    ov.Name == z);

2 ответа

Решение

Основываясь на некоторых ссылках, приведенных в ответе @ gideon, вы можете попробовать это следующим образом:

Сначала получите ShapeContainer по умолчанию, затем ищите фигуры внутри контейнера, имеющего тип OvalShape и имя равно y,

string y = "ovalShape_" + x;
var shapeContainer = this.Controls.OfType<ShapeContainer>().FirstOrDefault();
OvalShape light = shapeContainer.Shapes.OfType<OvalShape>().FirstOrDefault(o => o.Name == y);

Этот код работал нормально для меня, но имя сгенерировано после перетаскивания OvalShape на форме это что-то вроде "ovalShape" + x вместо "ovalShape_" + x Вот.

Из документов я вижу, что Shape добавляется первым в ShapeContainer, который является просто контейнерным элементом управления.

Затем ShapeContainer имеет свойство Shapes с типом ShapeCollection и предоставляет методы списка, такие как Contains.

Предполагая, что вы все настроили так:

 Microsoft.VisualBasic.PowerPacks.ShapeContainer canvas = 
    new Microsoft.VisualBasic.PowerPacks.ShapeContainer();
 Microsoft.VisualBasic.PowerPacks.OvalShape oval1 = 
    new Microsoft.VisualBasic.PowerPacks.OvalShape();
 // Set the form as the parent of the ShapeContainer.
 canvas.Parent = this;

for(int i =0;i < canvas.Count; i++)
{
  var shape = (Shape)canvas.Item[i];
   //now check if shape is your oval by looking at it's properties.
}

//You could also do this:
// (But this means you have to store a reference to your shape somewhere
// as some sort of global, not very good design.)
OvalShape myShape = ..
int index = canvas.IndexOf(myShape);
canvas.Item[index];//returns your shape.

Если вы собираетесь использовать цикл for, вы можете проверить свойство Name фигуры. Вы также можете использовать свойство Tag; Установите тег, чтобы сказать "OvalShape" а затем проверьте это в вашем цикле: if(shape.Tag == "OvalShape") {..,

Другие вопросы по тегам