# 55屆公開第三題
## 題目要求:
(1) 表單載入時顯示區設定為不顯示。
(2) 按下「開啟要顯示的檔案」按鈕時,跳出開啟的對話方塊,將預設目錄指定為目
前執行的目錄、可以開啟的檔案為文字檔(txt)、圖檔(jpg 或 png 或 bmp),設定
第一順位為文字檔。
(3) 選擇檔案後,依照被選擇的檔案類型決定需使用何種方式顯示,例如文字方塊或
圖片顯示器。
(4) 若開啟非以上格式,則顯示「不支援的檔案格式」訊息。
## 我的寫法
> **公開試題於競賽時得有百分之三十之調整**
### 介面
照著畫面拉取:

但因為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
> 
```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)
{
}
}
}
```
### 運行結果





## 完整程式碼檔案
放在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)
{
}
}
}
```