Я могу найти элемент управления по имени, но как мне найти 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") {..
,