找回密码
 立即注册
搜索
查看: 1580|回复: 15

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

[复制链接]
     
发表于 2021-5-26 10:28 | 显示全部楼层 |阅读模式
本帖最后由 独自旅行 于 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 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 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

这个好。
回复

使用道具 举报

     
发表于 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。
怎么用啊这两个后缀?
回复

使用道具 举报

     
发表于 2021-5-26 18:28 | 显示全部楼层
粗暴一点你子窗口不要卡死主窗口不就行了
回复

使用道具 举报

     
 楼主| 发表于 2021-5-26 18:32 | 显示全部楼层
real_zyf 发表于 2021-5-26 18:28
粗暴一点你子窗口不要卡死主窗口不就行了

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

使用道具 举报

     
发表于 2021-5-26 18:35 | 显示全部楼层
delegate
回复

使用道具 举报

     
 楼主| 发表于 2021-5-27 17:10 | 显示全部楼层
本帖最后由 独自旅行 于 2021-5-27 17:18 编辑

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



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

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

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

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

  22.         }
  23. void UsingFileSystemWatcher()
  24.         {
  25.             FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
  26.             fileSystemWatcher.Path = Application.StartupPath;                   //设置监控的文件目录
  27.             fileSystemWatcher.IncludeSubdirectories = false;                    //设置监控目标目录下的所有子目录
  28.             fileSystemWatcher.Filter = "*.ini";                                         //设置监控文件的类型
  29.             fileSystemWatcher.Changed += FileSystemWatcher_Changed;     //设置文件的文件名、目录名及文件的大小改动会触发Changed事件
  30.             fileSystemWatcher.EnableRaisingEvents = true;                       //启动监控
  31.         }
  32.          void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
  33.         {
  34.             LoadINI();
  35.         }
复制代码

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

回复

使用道具 举报

     
发表于 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

啊,原来如此。多谢指教。
————————————————后续更新————————————————————
干!成功解决问题!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-11-14 05:16 , Processed in 0.105333 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表