独自旅行 发表于 2021-5-26 10:28

【C#学习】如何实现子窗口按下设置按钮后刷新父窗口内容?

本帖最后由 独自旅行 于 2021-5-26 10:38 编辑

小程序设计为【主窗口】的TextBox只能读INI文件不能写,【子窗口.设置窗口】的TextBox文件可读INI、可写INI。
但是问题来了——如何让【主窗口】在后台持续刷新读取INI文件?

该用户不存在 发表于 2021-5-26 10:48

七氷 发表于 2021-5-26 10:49

委托

独自旅行 发表于 2021-5-26 10:53

该用户不存在 发表于 2021-5-26 10:48
循环命令

—— 来自 Hisense HLTE203T, Android 10上的 S1Next-鹅版 v2.4.4.1

循环命令让程序陷入死循环。

该用户不存在 发表于 2021-5-26 11:03

dpheix1 发表于 2021-5-26 11:16

做个数据绑定就行了,查下INotifyPropertyChanged

董卓 发表于 2021-5-26 11:27

垃圾点循环定时读文件、读文件元数据

高级点么类似Linux 的 inotify 机制在 Windows 中也有对应的 FindFirstChangeNotification API
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364417(v=vs.85).aspx

独自旅行 发表于 2021-5-26 11:31

dpheix1 发表于 2021-5-26 11:16
做个数据绑定就行了,查下INotifyPropertyChanged

这个好。

DTCPSS 发表于 2021-5-26 12:29

本帖最后由 DTCPSS 于 2021-5-26 12:36 编辑

INotifyPropertyChanged 的实现可以用 https://github.com/Fody/PropertyChanged 来做编译期织入,不用手动去触发事件了。
这项目 1400 星。.Net 5 的 Source Generator 也拿这个场景做 demo case。可见天下苦 XAML 久矣

独自旅行 发表于 2021-5-26 18:12

对了,问个事情哈。
我举个例子,子窗口格式大概是这样的:
{
子窗口 子= new 子窗口();
子.showdialo();
}
下班前翻了一下发现有其他后缀:子.Close或者子.FormClose。
怎么用啊这两个后缀?

real_zyf 发表于 2021-5-26 18:28

粗暴一点你子窗口不要卡死主窗口不就行了

独自旅行 发表于 2021-5-26 18:32

real_zyf 发表于 2021-5-26 18:28
粗暴一点你子窗口不要卡死主窗口不就行了

操作子窗口时关闭了主窗口的事情我没设想过,也在避免发生这个事情……

zxlice 发表于 2021-5-26 18:35

delegate

独自旅行 发表于 2021-5-27 17:10

本帖最后由 独自旅行 于 2021-5-27 17:18 编辑

看书发现INotifyPropertyChanged可以实现对流文件监控,所以想使用监控事件来触发重新读取INI文件。
但是它报错啊!
同样的功能(),按钮触发就正常运转,自动监控就报错。



懵了。如果按下面这么写,就会跳错『$exception      {"线程间操作无效: 从不是创建控件“socpath”的线程访问它。"}      System.InvalidOperationException』
===========================================================================

private void Form1_Load(object sender, EventArgs e)
      {
      LoadINI();
         UsingFileSystemWatcher();
      }
void LoadINI();
      {
                  str = Application.StartupPath + "\\ConnectString.ini";                                                //INI文件的物理地址
            strOne = System.IO.Path.GetFileNameWithoutExtension(str);                                     //获取INI文件的文件名

            if (File.Exists(str))                                                       //判断是否存在该INI文件
            {
                str_group = ContentReader(strOne, "Group", "");                         //读取INI文件中组名称
                str_job = ContentReader(strOne, "Server task", "");                     //读取INI文件中服务器任务
                str_soc = ContentReader(strOne, "Source Path", "");                     //读取INI文件中源文件夹
                str_opt = ContentReader(strOne, "Output path", "");                     //读取INI文件中输出文件夹
                str_ftpsvr = ContentReader(strOne, "FTP address", "");                  //读取INI文件中FTP服务器的内容
            }

            Group.Text = str_group;                                                   //显示INI文件中组名称
            job.Text = str_job;                                                         //显示INI文件中服务器任务
            socpath.Text = str_soc;                                                   //显示INI文件中源文件夹
            optpath.Text = str_opt;                                                   //显示INI文件中输出文件夹

      }
void UsingFileSystemWatcher()
      {
            FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
            fileSystemWatcher.Path = Application.StartupPath;                   //设置监控的文件目录
            fileSystemWatcher.IncludeSubdirectories = false;                  //设置监控目标目录下的所有子目录
            fileSystemWatcher.Filter = "*.ini";                                       //设置监控文件的类型
            fileSystemWatcher.Changed += FileSystemWatcher_Changed;   //设置文件的文件名、目录名及文件的大小改动会触发Changed事件
            fileSystemWatcher.EnableRaisingEvents = true;                     //启动监控
      }
         void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
      {
            LoadINI();
      }

===========================================================================
但是如果写成下面这样使用按钮人工触发的话又是正常运转的。
怎么治它啊?我想借助流文件监视来实现自动载入……
      private void button1_Click(object sender, EventArgs e)
      {
      LoadINI();
      }

hourousha 发表于 2021-5-27 17:21

不能在非UI线程里直接更新UI元素,得用Control.BeginInvoke或Control.Invoke

独自旅行 发表于 2021-5-27 20:20

本帖最后由 独自旅行 于 2021-5-28 09:13 编辑

hourousha 发表于 2021-5-27 17:21
不能在非UI线程里直接更新UI元素,得用Control.BeginInvoke或Control.Invoke
啊,原来如此。多谢指教。
————————————————后续更新————————————————————
干!成功解决问题!

页: [1]
查看完整版本: 【C#学习】如何实现子窗口按下设置按钮后刷新父窗口内容?