# 55屆公開第三題 ## 題目要求: (1) 表單載入時顯示區設定為不顯示。 (2) 按下「開啟要顯示的檔案」按鈕時,跳出開啟的對話方塊,將預設目錄指定為目 前執行的目錄、可以開啟的檔案為文字檔(txt)、圖檔(jpg 或 png 或 bmp),設定 第一順位為文字檔。 (3) 選擇檔案後,依照被選擇的檔案類型決定需使用何種方式顯示,例如文字方塊或 圖片顯示器。 (4) 若開啟非以上格式,則顯示「不支援的檔案格式」訊息。 ## 我的寫法 > **公開試題於競賽時得有百分之三十之調整** ### 介面 照著畫面拉取: ![image](https://hackmd.io/_uploads/BJvzoAZYJx.png) 但因為pictureBox和textbox是判斷文件後才要顯示,所以要先在Form1_Load寫好全部停用且不顯示 ```csharp private void Form1_Load(object sender, EventArgs e) { pictureBox1.Enabled = false; pictureBox1.Visible = false; textBox1.Enabled = false; textBox1.Visible = false; textBox1.ReadOnly = true; } ``` ### 載入文件 透過OpenFileDialog來選擇文件,並且只能選定所設定副檔名的檔案 ```csharp OpenFileDialog dialog = new OpenFileDialog(); dialog.Title = "選擇文字檔或圖片檔"; dialog.InitialDirectory = ".\\"; dialog.Filter = "text files (*.txt)|*.txt|image files (*.jpg;*.png;*.bmp)|*.jpg;*.png;*.bmp"; ``` ### 判斷文件 當用戶選擇好文件後,判斷檔名是不是圖片格式,如果是就顯示圖片,不是就另外判斷是不是文檔,如果用戶沒選擇檔案而關掉視窗的話顯示沒有選擇檔案(但題目沒要求) ```csharp if (dialog.ShowDialog() == DialogResult.OK) { string extension = Path.GetExtension(dialog.FileName).ToLower(); if (extension == ".jpg" || extension == ".png" || extension == ".bmp")//判斷是否是圖片文件 { pictureBox1.Enabled = true; pictureBox1.Visible = true; pictureBox1.Image = Image.FromFile(dialog.FileName); } else { pictureBox1.Enabled = false; pictureBox1.Visible = false; } if(extension ==".txt") //判斷是否是文檔 { textBox1.Enabled = true; textBox1.Visible = true; textBox1.Text= File.ReadAllText(dialog.FileName); } else {textBox1.Enabled = false; textBox1.Visible = false; } } //下面的else題目沒有要求 else { MessageBox.Show("沒有選擇文件", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); } ``` ### 判斷不支援的檔案格式 額外寫一個if判斷是不是指定格式以外的格式 > (2/7補)這裡寫法我根據同學的回饋修改了,本來是寫||但發現有bug > ![image](https://hackmd.io/_uploads/SkOhA0zKJe.png) ```csharp if(extension != ".jpg" && extension != ".png"&& extension != ".bmp"&& extension != ".txt") { MessageBox.Show("不支援的檔案格式", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); } ``` ### 完整程式碼 ```csharp= //避免錯誤,請勿直接複製貼上 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace CSA03 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { pictureBox1.Enabled = false; pictureBox1.Visible = false; textBox1.Enabled = false; textBox1.Visible = false; textBox1.ReadOnly = true; } private void button1_Click(object sender, EventArgs e) { try { OpenFileDialog dialog = new OpenFileDialog(); dialog.Title = "選擇文字檔或圖片檔"; dialog.InitialDirectory = ".\\"; dialog.Filter = "text files (*.txt)|*.txt|image files (*.jpg;*.png;*.bmp)|*.jpg;*.png;*.bmp"; if (dialog.ShowDialog() == DialogResult.OK) { string extension = Path.GetExtension(dialog.FileName).ToLower(); if (extension == ".jpg" || extension == ".png" || extension == ".bmp") { pictureBox1.Enabled = true; pictureBox1.Visible = true; pictureBox1.Image = Image.FromFile(dialog.FileName); } else { pictureBox1.Enabled = false; pictureBox1.Visible = false; } if (extension == ".txt") { textBox1.Enabled = true; textBox1.Visible = true; textBox1.Text = File.ReadAllText(dialog.FileName); } else { textBox1.Enabled = false; textBox1.Visible = false; } if (extension != ".jpg" && extension != ".png" && extension != ".bmp" && extension != ".txt") { MessageBox.Show("不支援的檔案格式", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { MessageBox.Show("沒有選擇文件", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); } } catch { MessageBox.Show("遇到錯誤!", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void pictureBox1_Click(object sender, EventArgs e) { } } } ``` ### 運行結果 ![image](https://hackmd.io/_uploads/Bk7sz1MY1l.png) ![image](https://hackmd.io/_uploads/B1niGJzFJg.png) ![image](https://hackmd.io/_uploads/S14hGyMFkx.png) ![image](https://hackmd.io/_uploads/HybpMkzKkx.png) ![image](https://hackmd.io/_uploads/rk54CCfF1x.png) ## 完整程式碼檔案 放在google雲端硬碟上 [點我下載](https://drive.google.com/file/d/1NdPB7luXTR0h58gQ0uri8w9wOZlYVaNd/view?usp=sharing) 壓縮檔有提供兩個txt跟jpg&png文件 結構應該長這樣: MD5:45ac249246154283a174d19b59479d62 ``` CSA03: │ CSA03.sln │ GAMERLEGION APPEAL TO VALVE ABOUT VRS CALCULATION DISCREPANCY.txt │ W-jvvDDmP6huxd9XOiHR-V.jpg │ wallhaven-wqom86_3840x2160.png │ 卓榮泰:增購10萬劑流感疫苗 供長者幼兒等高風險族群使用.txt │ └─CSA03 │ App.config │ CSA03.csproj │ CSA03.csproj.user │ CSA03_TemporaryKey.pfx │ Form1.cs │ Form1.Designer.cs │ Form1.resx │ Program.cs │ ├─bin │ ├─Debug │ │ │ CSA03.application │ │ │ CSA03.exe │ │ │ CSA03.exe.config │ │ │ CSA03.exe.manifest │ │ │ CSA03.pdb │ │ │ │ │ └─app.publish │ │ CSA03.exe │ │ │ └─Release │ │ CSA03.application │ │ CSA03.exe │ │ CSA03.exe.config │ │ CSA03.exe.manifest │ │ CSA03.pdb │ │ │ └─app.publish │ CSA03.exe │ ├─obj │ ├─Debug │ │ │ .NETFramework,Version=v4.7.2.AssemblyAttributes.cs │ │ │ CSA03.application │ │ │ CSA03.csproj.AssemblyReference.cache │ │ │ CSA03.csproj.CoreCompileInputs.cache │ │ │ CSA03.csproj.FileListAbsolute.txt │ │ │ CSA03.csproj.GenerateResource.cache │ │ │ CSA03.exe │ │ │ CSA03.exe.manifest │ │ │ CSA03.Form1.resources │ │ │ CSA03.pdb │ │ │ CSA03.Properties.Resources.resources │ │ │ DesignTimeResolveAssemblyReferences.cache │ │ │ DesignTimeResolveAssemblyReferencesInput.cache │ │ │ │ │ └─TempPE │ └─Release │ │ .NETFramework,Version=v4.7.2.AssemblyAttributes.cs │ │ CSA03.application │ │ CSA03.csproj.AssemblyReference.cache │ │ CSA03.csproj.CoreCompileInputs.cache │ │ CSA03.csproj.FileListAbsolute.txt │ │ CSA03.csproj.GenerateResource.cache │ │ CSA03.exe │ │ CSA03.exe.manifest │ │ CSA03.Form1.resources │ │ CSA03.pdb │ │ CSA03.Properties.Resources.resources │ │ DesignTimeResolveAssemblyReferencesInput.cache │ │ │ └─TempPE └─Properties AssemblyInfo.cs Resources.Designer.cs Resources.resx Settings.Designer.cs Settings.settings ``` ## 後面的補充&後記 (2025.2.15)這題似乎可以用switch,這樣就不用寫3個if迴圈了 後續:事實證明是可以的,且程式會簡化很多: ```csharp= using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace CSA03 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { pictureBox1.Enabled = false; pictureBox1.Visible = false; textBox1.Enabled = false; textBox1.Visible = false; textBox1.ReadOnly = true; } private void button1_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Title = "選擇文字檔或圖片檔"; dialog.InitialDirectory = ".\\"; dialog.Filter = "text files (*.txt)|*.txt|image files (*.jpg;*.png;*.bmp)|*.jpg;*.png;*.bmp"; if (dialog.ShowDialog() == DialogResult.OK) { string extension = Path.GetExtension(dialog.FileName).ToLower(); switch(extension) { case ".jpg": case ".png": case ".bmp": textBox1.Enabled = false; textBox1.Visible = false; pictureBox1.Enabled = true; pictureBox1.Visible = true; pictureBox1.Image = Image.FromFile(dialog.FileName); break; case ".txt": pictureBox1.Enabled = false; pictureBox1.Visible = false; textBox1.Enabled = true; textBox1.Visible = true; textBox1.Text = File.ReadAllText(dialog.FileName); break; default: MessageBox.Show("不支援的檔案格式", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); break; } } } private void pictureBox1_Click(object sender, EventArgs e) { } } } ```