---
# System prepended metadata

title: 55屆公開第三題

---

# 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)
        {

        }
    }
}
```

