无法在 C# 中更新 UI 组件

Posted

技术标签:

【中文标题】无法在 C# 中更新 UI 组件【英文标题】:Unable to update the UI components in C# 【发布时间】:2012-10-26 02:43:15 【问题描述】:

我正在编写一个程序来监控网络上各种设备的状态。这些设备的详细信息存储在一个文件中。 HandleClientComm 类从文件中读取有关这些设备的信息并与它们建立 tcp 连接。读取文件后,使用 manEvent 进行通知。为每个设备调用 UpdateGUI 函数。当 data.caller 等于 1 时,它会为该设备添加控件,但禁用组框。函数 hd.StartThreads 使用 Threadpool 侦听来自各种设备的连接。接受连接后,将再次调用 UpdateGUI 函数,其 data.caller 值为 2。我的问题是未启用 groupbox。消息框显示“开始”,但没有结束。尝试访问除 groupbox 以外的其他控件,但发现我无法从那里访问任何控件。是不是消息循环有问题,因为我的代码中没有运行无限循环?

namespace FA

  public partial class EditDevice : Form
  
      public struct DisplayComponents
      
          public GroupBox gp;
          public List<Panel> labelPanel;
          public List<FlowLayoutPanel> picPanel;
          public List<Label> LabelList;
          public List<PictureBox> Pics;
          public Label Mid, Date, Time;
          public int gpHeight, gppt;
      ;
      public DisplayComponents[] comps;
      private DeviceList[] dev;
      private ManualResetEvent manEvent;
      private int devCount;
      private HandleClientComm hd;

      public EditDevice()
      
          InitializeComponent();
          //Create event to notify whether device file has been read
          manEvent = new ManualResetEvent(false);
          //Create object of the client communication class
          hd = new HandleClientComm(manEvent);
          //wait for the file read notification
          manEvent.WaitOne();
          //get the device count
          devCount = hd.devCount;
          //get the device details
          dev = hd.dv; 
          initializeForm();
          //Add event handler for device status change
          hd.StatusChanged += new HandleClientComm.StatusChangeHandler(UpdateGUI);
          //Start thread to monitor device status
          Thread th = new Thread(hd.StartThreads);
          th.Start();
          th.Join();
      

       public void initializeForm()
      
          //Create components
          comps = new DisplayComponents[hd.devCount];
          // Groupbox initial point
          int gppt = 40;
          //Calculate Groupbox point and heights for each devices
          for (int i = 0; i < devCount; i++)
          
              comps[i].gpHeight = 60;
              comps[i].gpHeight = comps[i].gpHeight + (dev[i].Zones / 21) * 77;
              if (dev[i].Zones % 21 != 0)
                  comps[i].gpHeight += 77;
              comps[i].gppt = gppt;
              gppt += comps[i].gpHeight+10;
           
      

      private void UpdateGUI(object sender, StatusChangeEventArgs data)
      
          if (data.caller == 1)
          
              //Function to add controls to the form
              addDeviceControls(data.index);
          
          else
          
              MessageBox.Show("begin");
              comps[data.index].gp.Enabled = true;
              MessageBox.Show("end");
          
      
   

 public class StatusChangeEventArgs : EventArgs
  
      public int index  get; internal set; 
      public int caller  get; internal set; 

      public StatusChangeEventArgs(int index1, int callno)
      
          this.index = index1;
          this.caller = callno;
      
  

【问题讨论】:

尝试使用 try-catch 捕获执行。也许有跨线程执行 【参考方案1】:

听起来您的HandleClient.Comm.StatusChangehandler(UpdateGUI); 调用正在消耗错误,或者更高级别的东西正在捕获它们。您是否尝试过中断指向和单步执行代码?

为了从不同线程更新控件,您需要在主线程上调用更改。

请查看此问题,因为它可能会对您有所帮助。 How to update the GUI from another thread in C#?

如果您使用的是 WPF,则其完成方式略有不同,需要调用 Dispatcher.Invoke 以进行更新。

我希望这对您有所帮助。听起来你的错误确实在你不知情的情况下被消耗掉了。

【讨论】:

非常感谢!问题出在调用上。

以上是关于无法在 C# 中更新 UI 组件的主要内容,如果未能解决你的问题,请参考以下文章

无法为语义 UI 反应组件检查 expect(elm).not.toBeVisible()

(Unity) 我无法在 GameManager 中拖动 UI 组件

vue组件样式添加scoped属性之后,无法被父组件修改。或者无法在本组件修改element UI样式

我无法在 WPF 的现代 UI 中启用我的列表框(vs2013 C#)

无法在反应 js 类组件中编辑 datetimepicker material-ui

关于Element UI tree组件 懒加载的更新操作