繁体   English   中英

从另一个类运行SaveFileDialog

Run SaveFileDialog from another class

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试编写一种将文件从服务器传输到客户端的软件...这就是我的软件的工作原理。在客户端,它获取IP,然后从Client类生成一个新对象到新线程,并将ip和端口传递给构造函数,客户端处理连接并将文件传输到byte []变量。现在,我想用saveFileDialog提示用户以保存文件...但是我无权访问作为我的表格的父类。 所以我不能做类似savefiledialog.ShowDialog()的事情。解决此问题的方法是什么?

2 个回复

@syned建议的事件是一个很好的解决方案。 它是一个观察者 ,但是在此示例中,您需要与可观察类(客户端)进行交互。

您可以在客户端类中声明一个事件,因此在要接收文件时可以使用此事件。 通常的方法是有一个特殊的“上下文类”,用您需要的值填充。

public class Client {
    public event EventHandler<ReceivedFileEventArgs> ReceivedFile;

    private ReceivedFileEventArgs onReceivedFile() {
        EventHandler<ReceivedFileEventArgs> handler = ReceivedFile;
        ReceivedFileEventArgs args = new ReceivedFileEventArgs();
        if (handler != null) { handler(this, args); }
        return args;
    }

    private void receiveFileCode() {
        // this is where you download the file
        ReceivedFileEventArgs args = onReceivedFile();
        if (args.Cancel) { return; }
        string filename = args.FileName;
        // write to filename
    }
}

public class ReceivedFileEventArgs {
    public string FileName { get; set; }
    public bool Cancel { get; set; }
}

现在,在您的GUI类中,您可以“监听”该事件,并将文件名设置为所需的文件名。

public class MyForm : Form {
   public MyForm() { Initialize(); }

   protected void buttonClick(object sender, EventArgs e) {
       // Suppose we initialize a client on a click of a button
       Client client = new Client();
       // note: don't use () on the function here
       client.ReceivedFile += onReceivedFile;
       client.Connect();
   }

   private void onReceivedFile(object sender, ReceivedFileEventArgs args) {
       if (InvokeRequired) {
           // we need to make sure we are on the GUI thread
           Invoke(new Action<object, args>(onReceivedFile), sender, args);
           return;
       }
       // we are in the GUI thread, so we can show the SaveFileDialog
       using (SaveFileDialog dialog = new SaveFileDialog()) {
           args.FileName = dialog.FileName;
       }
   }
}

那么,什么是事件? 简单来说,它是一个函数指针(但请仔细阅读以获取更多详细信息)。 因此,您告诉您的客户端类在某些情况下(例如,当要接收文件时)调用该函数。 在使用Windows窗体时,几乎总是使用事件,例如,在文件背后的代码中为函数分配按钮单击时。

现在,使用此模式,您可以拥有更多事件,例如FileDownloadCompleted

另请注意+=语法。 您没有事件分配给函数,而是告诉事件在事件发生时调用该函数。 如果需要,您甚至可以在同一事件上具有两个功能。

1 从另一个类运行GUI?

我构建了一个GUI,现在我试图从我的控制器(main.java)类启动它。 我不知道该怎么做。 实例化它不起作用(即GUI gui = new GUI();不起作用)。 我觉得这里有一些显而易见的东西,但是广泛的谷歌搜索让我没有结果。 我试图在主线程中运行GUI并有一个单独的线程 ...

2 如何从另一个类运行TestNG类

嗨,当我按预期方式执行以下testNG文件作为独立脚本时。 O / P: 但是为什么当从另一个类中调用时却没有同样的效果呢? 当从另一个班级触发时,请帮助达到相同的目的。 以下是调用测试班的班级 O / P: ...

3 使用JButton从另一个类运行主类

我有一个Java项目(俄罗斯方块游戏),我将其导入了另一个项目。 基本上,我想通过简单的按钮单击来运行游戏(在NetBeans JFrame中,不是类)。 我可以这样工作: 它工作正常,但是当我尝试按钮单击事件时: 它给了我一个空白的框,我想也许是参数,因为它可以在mai ...

5 如何从另一个班级上一个班级

我有一个erdbuilder类和另一个SQL类。 我的erdbuilder类允许我绘制形状并将它们存储在arraylist Connection 。 然后,我从SQL类访问arraylist Connection从那里我将从arraylist中检索数据。 我在erdbuilder班上有个主 ...

6 服务器上的回调中的Savefile对话框

我们有一个按钮,它会触发一个命令,该命令将发送到服务器进行一些验证。 这是异步完成的,并且如果验证正常(即用户具有正确的权限),我想显示SaveFileDialog。 但是,这不是用户启动的操作,这意味着调用SaveFileDialog.ShowDialog()方法会引发“对话框必须由用 ...

7 如何从另一个类运行方法

在TabBarViewController类中,我具有startUpdateNPendingMessagesTimer方法,该方法运行NSTimer 我也有timerStop使用invalidate方法停止此NSTimer 在另一个类settingsViewController , ...

8 从另一个类的UI线程运行

我搜索了一个解决方案但找不到一个,所以我会在这里问: 我正在尝试在mainActivity中使用setText命令,直到现在我已经使用过: 现在我正在尝试做同样的事情,但是从另一个类我不能使用:MainActivity.this。 我试图使用我在另一个问题上找到的代码但没有成 ...

10 从另一个类运行TestNG测试

有没有办法从另一个java类运行TestNG测试。 我需要在具有不同参数的单个套件中运行相同的方法。(Inside for循环) 可能吗? 另外,我看到dataprovider方法应该返回Object[][] 。 这适用于具有两个参数的方法。 我们可以发送两个以上的参数吗 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM