2015-01-21 18 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

相关问题