2015-01-21 50 views
0

我剛剛開始使用C#,作爲一個項目,我決定嘗試製作一個圖像轉換器,但我似乎無法獲得在我的button1上下文中可訪問的變量「open」,我不尋找評論我的代碼有多糟糕,我剛剛開始......我只想完成它並添加到它,稍後我會改進代碼,謝謝。那我該如何讓它可以訪問?如何使OpenFileDialog變量Global?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.IO; 

namespace WindowsFormsApplication9 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public void button2_Click(object sender, EventArgs e) 
    { 
     OpenFileDialog open = new OpenFileDialog(); 
     // image filters 
     open.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp"; 
     if (open.ShowDialog() == DialogResult.OK) 
     { 
      // image in picture box 
      pictureBox1.Image = new Bitmap(open.FileName); 
      pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize; 
      // image file path 
      string path = Directory.GetCurrentDirectory(); 
      textBox1.Text = Path.GetDirectoryName(open.FileName); 
     } 

     } 


    public void Form1_Load(object sender, EventArgs e) 
    { 
     this.AutoSize = true; 
     this.AutoSizeMode = AutoSizeMode.GrowAndShrink; 

     flowLayoutPanel1 = new FlowLayoutPanel(); 
     flowLayoutPanel1.AutoSize = true; 
     flowLayoutPanel1.AutoSizeMode = AutoSizeMode.GrowAndShrink; 
     this.Controls.Add(flowLayoutPanel1); 
    } 

    public void button1_Click(object sender, EventArgs e) 
    { 
     int selectedIndex = comboBox1.SelectedIndex; 
     Object selectedItem = comboBox1.SelectedItem; 

     if ((string)comboBox1.SelectedItem == "*.jpg") 
     { 
      pictureBox1.Image.Save(@"" + textBox1.Text + open.FileName + "", System.Drawing.Imaging.ImageFormat.Jpeg); 
     } 
    } 
} 
} 
+1

介意你要請分享製作'開放的理念'可訪問?提問的理由是,看到你的代碼並不適合。該變量可以被聲明爲一個類變量或者你提供一個私有屬性;然而,'OpenFileDialog'是一個模態對話框並返回一個結果 - 你通常不想再次訪問變量,特別是不能從不同的上下文訪問變量。 – 2015-01-21 04:09:22

回答

1

您可以將變量移出方法並移入類中,使其成爲類的實例字段。那麼任何方法都可以看到它。但是,這種方法有一些問題:

  1. 與任何模式對話框一樣,OpenFileDialog應該在處理完之後處理掉。在實例字段中存儲引用會延長其使用期限,直到下一次創建新引用時或表單關閉爲止,以先到者爲準。
  2. 您真正需要的是文件名,而不是OpenFileDialog帶有的所有其他數據和資源,因此很浪費。
  3. 從用戶體驗的角度來看,最好讓用戶有機會保存到不同的文件。您最好向用戶提供SaveFileDialog,用當前選定的文件名進行初始化。

與您當前的UI設計堅持,以下是你想要做什麼的正確方法:

private string fileName; 

public void button2_Click(object sender, EventArgs e) 
{ 
    using (OpenFileDialog open = new OpenFileDialog()) 
    { 
     // image filters 
     open.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp"; 
     if (open.ShowDialog() == DialogResult.OK) 
     { 
      // image in picture box 
      filename = open.FileName; 
      pictureBox1.Image = new Bitmap(open.FileName); 
      pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize; 
      // image file path 
      string path = Directory.GetCurrentDirectory(); 
      textBox1.Text = Path.GetDirectoryName(open.FileName); 
     } 
    } 
} 

public void button1_Click(object sender, EventArgs e) 
{ 
    if (string.IsNullOrEmpty(fileName)) 
    { 
     return; 
    } 

    int selectedIndex = comboBox1.SelectedIndex; 
    Object selectedItem = comboBox1.SelectedItem; 

    if ((string)comboBox1.SelectedItem == "*.jpg") 
    { 
     pictureBox1.Image.Save(@"" + textBox1.Text + fileName + "", System.Drawing.Imaging.ImageFormat.Jpeg); 
    } 
} 

注意使用using,以確保當它沒有該OpenFileDialog實例妥善處置更長的需要。

0

C#沒有全局變量,但你可以有一個解決辦法,

public class GlobalObjects 
{ 
    private static OpenFileDialog ofd; 

    public static OpenFileDialog OpenFileDlg 
    { 
     get 
     { 
      if (ofd == null) 
       ofd = new OpenFileDialog(); 
      return ofd; 
     } 
    } 

} 

,並這樣稱呼它,

var fileDlg = GlobalObjects.OpenFileDlg; 
+0

@Shad沒有要求全局變量。你的建議增加了一個靜態的概念,他也沒有要求對話的使用。另外請記住:對話框通常只用一次,然後處理。 – 2015-01-21 04:34:34

相關問題