c# Windows 将图片框添加到数组的表单
c# Windows Forms adding pictureBoxes to an Array
我需要将 PictureBox's
(pictureBox11
到 pictureBox30
)添加到数组。
所以不要像这样添加 PictureBox:
PictureBox[] Coins = new PictureBox[20];
Coins[0] = pictureBox11;
...
Coins[19] = pictureBox30;
我写了一个这样的 for 循环(不起作用):
for (int i = 11; i < 31; i++)
{
for (int j = 0; j < Coins.Length; j++)
{
Coins[j] = (PictureBox)Controls.Find(
"pictureBox" + i.ToString(), true)[0];
}
}
某处可能有一个小的愚蠢错误,因为我对另一件事使用了相同的循环并且它有效,idk,也许我只是瞎了,看不到错误。
也许它是相关的,所以我将包括我为数组元素分配的代码:
for (int i = 0; i < Coins.Length; i++)
{
if (player.Bounds.IntersectsWith(Coins[i].Bounds))
{
Coins[i].Visible = false;
}
}
如果我按照第一个代码所示添加它们,一切正常,但不是很实用。
为什么我写的第二个代码(for 循环)对我不起作用?
有没有更好的方法将多个图片框添加到一个数组中?
我猜你把事情搞得比实际情况更复杂了。为了更好地理解,我假设当你说 我需要将图片框(pictureBox11 到 pictureBox30)添加到数组时。 你的意思是有 30+ PictureBox
s on您的表单和每个 PictureBox
使用命名约定,这样每个表单都被命名为“pictureBoxX”,其中“X”是 1,2,3…30,31。然后你想在表单上获得一组(连续的?)“PictureBoxes”以使其不可见。我希望这是正确的。
为了简单地使图片框不可见,我认为不需要数组。简单地遍历图片框,如果名称与“pictureBoxX”形式的字符串匹配,则使其不可见。我使用 IndexsAreValid
方法来验证开始和结束索引。此代码下方的数组实现代码中也使用了它。
不使用数组使图片框不可见
private void SetPictureBoxesInvisible(int start, int end) {
int size = -1;
string targetString = "";
if (IndexsAreValid(start, end, out size)) {
for (int i = start; i < end + 1; i++) {
try {
targetString = "pictureBox" + i;
PictureBox target = (PictureBox)Controls.Find(targetString, true)[0];
if (target != null) {
target.Visible = false;
}
}
catch (IndexOutOfRangeException e) {
return;
}
}
}
}
如果您必须返回一个 PictureBox
数组,那么下面的代码应该有效。
首先,要根据需要获取 PictureBox
的数组,您需要一个数组来存储它们。但首先你需要知道它有多大。从您发布的代码看来,您想要获取图片框 11-30 并将它们放在一个数组中。所以我们可以从这些数字中得到大小……即 30-11=19 +1 = 20。这就是你所需要的。只需创建数组并循环遍历所有图片框并获取 pictureBox11-pictureBox30。完成后,我们可以使用此数组使这些“PictureBoxes”不可见。
我创建了一个类似于 tryParse
的方法 IsValidPic
来验证给定的索引 (1,2,3..30) 是否有效。如果超出范围,我将忽略该值。这使您能够在所需图片框不连续的情况下抓取单个图片框。我用了几个按钮来测试这些方法。
希望这对您有所帮助。
private PictureBox[] GetPictureBoxes(int start, int end) {
int size = - 1;
if (IndexsAreValid(start, end, out size)) {
PictureBox curPic = null;
PictureBox[] allPics = new PictureBox[size];
int index = 0;
for (int i = start; i <= end; i++) {
if (IsValidPic(i, out curPic)) {
allPics[index] = curPic;
index++;
}
}
return allPics;
}
else {
return new PictureBox[0];
}
}
private Boolean IndexsAreValid(int start, int end, out int size) {
if (start < 1 || end < 1) {
size = -1;
return false;
}
if (start > end) {
size = -1;
return false;
}
size = end - start + 1;
return true;
}
private Boolean IsValidPic(int index, out PictureBox picture) {
string targetName = "pictureBox" + index;
try {
PictureBox target = (PictureBox)Controls.Find(targetName, true)[0];
if (target != null) {
picture = target;
return true;
}
picture = null;
return false;
}
catch (IndexOutOfRangeException e) {
picture = null;
return false;
}
}
private void ResetAll() {
foreach (PictureBox pb in this.Controls.OfType<PictureBox>()) {
pb.Visible = true;
}
}
private void button1_Click(object sender, EventArgs e) {
TurnInvisible(2, 3);
}
private void button3_Click(object sender, EventArgs e) {
TurnInvisible(11, 30);
}
private void button4_Click(object sender, EventArgs e) {
TurnInvisible(1,7);
}
private void TurnInvisible(int start, int end) {
PictureBox[] pictureBoxesToChange = GetPictureBoxes(start, end);
foreach (PictureBox pb in pictureBoxesToChange) {
if (pb != null)
pb.Visible = false;
}
}
private void button2_Click(object sender, EventArgs e) {
ResetAll();
}
我需要将 PictureBox's
(pictureBox11
到 pictureBox30
)添加到数组。
所以不要像这样添加 PictureBox:
PictureBox[] Coins = new PictureBox[20];
Coins[0] = pictureBox11;
...
Coins[19] = pictureBox30;
我写了一个这样的 for 循环(不起作用):
for (int i = 11; i < 31; i++)
{
for (int j = 0; j < Coins.Length; j++)
{
Coins[j] = (PictureBox)Controls.Find(
"pictureBox" + i.ToString(), true)[0];
}
}
某处可能有一个小的愚蠢错误,因为我对另一件事使用了相同的循环并且它有效,idk,也许我只是瞎了,看不到错误。
也许它是相关的,所以我将包括我为数组元素分配的代码:
for (int i = 0; i < Coins.Length; i++)
{
if (player.Bounds.IntersectsWith(Coins[i].Bounds))
{
Coins[i].Visible = false;
}
}
如果我按照第一个代码所示添加它们,一切正常,但不是很实用。
为什么我写的第二个代码(for 循环)对我不起作用?
有没有更好的方法将多个图片框添加到一个数组中?
我猜你把事情搞得比实际情况更复杂了。为了更好地理解,我假设当你说 我需要将图片框(pictureBox11 到 pictureBox30)添加到数组时。 你的意思是有 30+ PictureBox
s on您的表单和每个 PictureBox
使用命名约定,这样每个表单都被命名为“pictureBoxX”,其中“X”是 1,2,3…30,31。然后你想在表单上获得一组(连续的?)“PictureBoxes”以使其不可见。我希望这是正确的。
为了简单地使图片框不可见,我认为不需要数组。简单地遍历图片框,如果名称与“pictureBoxX”形式的字符串匹配,则使其不可见。我使用 IndexsAreValid
方法来验证开始和结束索引。此代码下方的数组实现代码中也使用了它。
不使用数组使图片框不可见
private void SetPictureBoxesInvisible(int start, int end) {
int size = -1;
string targetString = "";
if (IndexsAreValid(start, end, out size)) {
for (int i = start; i < end + 1; i++) {
try {
targetString = "pictureBox" + i;
PictureBox target = (PictureBox)Controls.Find(targetString, true)[0];
if (target != null) {
target.Visible = false;
}
}
catch (IndexOutOfRangeException e) {
return;
}
}
}
}
如果您必须返回一个 PictureBox
数组,那么下面的代码应该有效。
首先,要根据需要获取 PictureBox
的数组,您需要一个数组来存储它们。但首先你需要知道它有多大。从您发布的代码看来,您想要获取图片框 11-30 并将它们放在一个数组中。所以我们可以从这些数字中得到大小……即 30-11=19 +1 = 20。这就是你所需要的。只需创建数组并循环遍历所有图片框并获取 pictureBox11-pictureBox30。完成后,我们可以使用此数组使这些“PictureBoxes”不可见。
我创建了一个类似于 tryParse
的方法 IsValidPic
来验证给定的索引 (1,2,3..30) 是否有效。如果超出范围,我将忽略该值。这使您能够在所需图片框不连续的情况下抓取单个图片框。我用了几个按钮来测试这些方法。
希望这对您有所帮助。
private PictureBox[] GetPictureBoxes(int start, int end) {
int size = - 1;
if (IndexsAreValid(start, end, out size)) {
PictureBox curPic = null;
PictureBox[] allPics = new PictureBox[size];
int index = 0;
for (int i = start; i <= end; i++) {
if (IsValidPic(i, out curPic)) {
allPics[index] = curPic;
index++;
}
}
return allPics;
}
else {
return new PictureBox[0];
}
}
private Boolean IndexsAreValid(int start, int end, out int size) {
if (start < 1 || end < 1) {
size = -1;
return false;
}
if (start > end) {
size = -1;
return false;
}
size = end - start + 1;
return true;
}
private Boolean IsValidPic(int index, out PictureBox picture) {
string targetName = "pictureBox" + index;
try {
PictureBox target = (PictureBox)Controls.Find(targetName, true)[0];
if (target != null) {
picture = target;
return true;
}
picture = null;
return false;
}
catch (IndexOutOfRangeException e) {
picture = null;
return false;
}
}
private void ResetAll() {
foreach (PictureBox pb in this.Controls.OfType<PictureBox>()) {
pb.Visible = true;
}
}
private void button1_Click(object sender, EventArgs e) {
TurnInvisible(2, 3);
}
private void button3_Click(object sender, EventArgs e) {
TurnInvisible(11, 30);
}
private void button4_Click(object sender, EventArgs e) {
TurnInvisible(1,7);
}
private void TurnInvisible(int start, int end) {
PictureBox[] pictureBoxesToChange = GetPictureBoxes(start, end);
foreach (PictureBox pb in pictureBoxesToChange) {
if (pb != null)
pb.Visible = false;
}
}
private void button2_Click(object sender, EventArgs e) {
ResetAll();
}