我正在創建這個windows forms c#應用程式,我可以從檔案夾中加載圖片,通過點擊圖片選擇其中的幾個,然后將它們復制到另一個檔案夾。到目前為止,一切似乎都很好,但現在我遇到了問題。我有10個bools,代表每個圖片的狀態(選中或未選中)。
public partial class Form1 。Form : Form
{
public bool selected1 = false;
public bool selected2 = false;
public bool selected3 = false;
public bool selected4 = false;
public bool selected5 = false;
public bool selected6 = false;
public bool selected7 = false;
public bool selected8 = false;
public bool selected9 = false;
public bool selected10 = false;
這些是那些bool。 接下來我把它們放在串列中(我也測驗了陣列)
private List< bool> selectedBools = new List<bool>()。
然后我在Public Form1()中給串列分配了bools:
selectedBools = new List<bool> { selected1, selected2, selected3, selected4, selected5, selected6, selected7, selected8, selected9, selected10 };
每張圖片的狀態都由這段代碼控制(每個picturebox_click都有相同的代碼,但數字有所變化)
private void pictureBox2_Click_1(object sender, EventArgs e)。
{
if (selected1 == false)
{
pctBox1.Image = null;
selected1 = true;
pctBox1.BackColor = Color.Red;
}
else if (selected1 == true)
{
selected1 = false;
pctBox1.BackColor = Color.White;
try
{
pctBox1.Image = Image.FromFile(filePaths[0 Page * 10]); // refresh image
}
捕獲
{
}
}
}
當我按下改變 "頁面"(這只是將每張圖片移動10)時,我又將所有的bools設定為false。 問題是當我想把這些圖片 "上傳到 "檔案夾時(只是復制選擇到那里):
private void UploadAllButton_Click(object sender, EventArgs e)。
{
Console.WriteLine(selected1.ToString() selected2 selected3 selected4 selected5 selected6 selected7 selected8 selected9 selected10) 。
DialogResult result = MessageBox.Show(this, "你確定嗎?", "全部上傳", MessageBoxButtons.YesNo, MessageBoxIcon.Question) 。
if (result == DialogResult.Yes)
{
List<int> selectedBooleansIndexes = new List<int> ()。
int i = 10;
foreach (bool selected in selectedBools)
{
i--;
Console.WriteLine(selected);
Console.WriteLine(selectedBools[i])。
if (selected == true)
{
int index = selectedBools.FindIndex(a => a = true) 。
selectedBooleansIndexes.Add(index);
Console.WriteLine(selectedBooleansIndexes.Count)。
}
if (i == 0)
{
Console.WriteLine(selected1.ToString() selected2 selected3 selected4 selected5 selected6 selected7 selected8 selected9 selected10) 。
MessageBox.Show(this, selectedBooleansIndexes.Count.ToString(), "siur") 。
當我選擇一些圖片時,它們的選擇bool會變為true。所以我想抓住那些被設定為 "真 "的圖片,并獲得它們的索引,這樣以后我就可以在復制檔案時使用這些索引。問題是當我運行if (selected == true )時,所有的圖片似乎都是假的,什么也沒有發生。我通過在控制臺中手動輸入每個bool的狀態來檢查,當我這樣做時,它就會按計劃作業。所以我的問題是,當我使用foreach回圈時,每個bool的狀態都是假的,盡管它不是(我檢查了很多次,因為我認為在代碼中不同的地方有東西覆寫它們)。也許我錯過了什么,但這很奇怪。
uj5u.com熱心網友回復:
讓我們簡化你的代碼,以便解釋:
bool b1 = false。
bool b2 = false; false
到這里,一切都符合你的預期。b1和b2都是false。
List<bool> l = new List<bool>(){b1, b2};
你現在有一個帶有副本的b1和b2的串列。這是因為booleans是值型別。
這意味著什么?
這意味著什么呢?如果你改變了b1,[0]將不隨其改變。如果您改變l[0],b1將不隨之改變。對于b2和l[1]也是如此。它們是完全獨立的。
現在讓我們轉到更大的問題上。你肯定不想要副本,所以不要創建它們。
代替
public bool selected1 = false;
[...]
public bool selected10 = false;
使用串列only,并通過其索引訪問條目。想想看,一個應用程式有1000張圖片,而不是10張。你不希望宣告1000個變數,對嗎?
讓我們創建一個包含10個布爾運算的串列,初始化為false(因為那是它們的默認值):
List<bool> selected = new List< bool>(new bool[10] )。)
讓我們也把你所有的圖片框放到一個串列中:
。List<PictureBox> pictures = List<PictureBox> {pctBox1, ... pctBox10}。
當pctBox1改變時,pictures[0]將隨之改變。它是不是一個副本。這將發揮作用,因為PictureBox是一個參考型別,而不是一個值型別。
這樣一來,你可以定義一個單一的方法來做所有的事情:
private void DoSomething(int index)
{
if (selected[index] == false)
{
pictures[index].Image = null;
selected[index] = true;
pictures[index].BackColor = Color.Red;
}
else // DONE: if (selected[index] == true) is unnecessary, because true is the only option left[/span
{
selected[index] = false;
pictures[index].BackColor = Color.White;
try 試一試
{
pictures[index].Image = Image.FromFile(filePaths[index Page * 10]); //重繪 影像。
}
捕獲 { } // TODO:修復不良錯誤處理。
}
}
而每一個點擊事件處理程式都變得像
一樣簡單private void pictureBox2_Click_1(object sender, EventArgs e)。
{
DoSomething(0); //僅改變索引。
}
我們通常會進一步簡化DoSomething()方法。
private void DoSomething(int index)
{
selected[index] = !selected[index]; // Flip the value
pictures[index].BackColor = selected[index]?Color.White:Color.Red; //選擇背面顏色。
pictures[index].Image = null; // Reset always, since it doesn't really matter.
if (selected[index])
{
try (selected[index]) {
{
pictures[index].Image = Image.FromFile(filePaths[index Page * 10]); // refresh image.
}
捕獲 {} //TODO:仍然修復錯誤處理不好的問題。
}
}
我想今天就到此為止了。人們可能也不會手動創建10個圖片框,而是讓它們在一個回圈中被創建。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/326915.html
標籤:
