C# 如何在基础数据集更改时触发“面板更新控件”

C# 如何在基础数据集更改时触发“面板更新控件”,c#,winforms,user-controls,C#,Winforms,User Controls,目前,我有一个datatable,它由“enablelocation”字段排序,用户可以添加项目并重新定位它们。然后使用此数据表创建添加到面板的用户控件 目前,我们正在清除控件,然后在每次发生更改时重建面板,但这种情况并不常见,因此我正在寻找一种在发生更改时更新面板上控件的方法 当前代码如下: private void UpdateCats(int formid) { //update dataset cassess.Tables["CaseAssessDefCats"]

目前,我有一个datatable,它由“enablelocation”字段排序,用户可以添加项目并重新定位它们。然后使用此数据表创建添加到面板的用户控件

目前,我们正在清除控件,然后在每次发生更改时重建面板,但这种情况并不常见,因此我正在寻找一种在发生更改时更新面板上控件的方法

当前代码如下:

    private void UpdateCats(int formid) {
      //update dataset
  cassess.Tables["CaseAssessDefCats"].Clear();
  DataTable tcats = Requests.SQLGen.ProcessSQLCommand(gobj, null, "select id,name,shownohistory, case when EnableLocation is null then 1 else EnableLocation end as EnableLocation,FormID from CaseAssessDefCats where EnableLocation >= 0 and FormID = " + formid + " order by EnableLocation, Name", false, true);
  if (tcats != null && tcats.Rows.Count > 0) {
    tcats.TableName = "CaseAssessDefCats";
    cassess.Merge(tcats);
  }
     //end update dataset
  try {
    if (_processing) { //check if update is running
      return;
    }
    ClearAssessment(); //removes all the controls
    _processing = true;
    panMain.Refresh();
    panMain.SuspendLayout();
      //loop through datatable, re-adding them as controls
    for (int a = cassess.CaseAssessDefCats.Rows.Count - 1; a >= 0; a--) {

      trow = cassess.CaseAssessDefCats[a];
      tcat = new CaseAssessDefCat(cassess, trow, gobj);
      tcat.Tag = trow.ID;
      tcat.catUp += new EventHandler(CatUp);
      tcat.catDown += new EventHandler(CatDown);
      tcat.catDelete += new EventHandler(CatDelete);
      tcat.catEnter += new EventHandler(CatEnter);
      tcat.catLeave += new EventHandler(CatLeave);
      tcat.catEdit += new EventHandler(CatEdit);
      tcat.catNew += new EventHandler(CatNew);
      panMain.Controls.Add(tcat);
      tcat.Dock = DockStyle.Top;
    }
    panMain.ResumeLayout();
    _processing = false;
    return;
  } catch {
    panMain.ResumeLayout();
    _processing = false;
    return;
  }
}

更新是什么意思?难道你不能访问每个控件并对其执行你喜欢的操作吗?也许您需要更好地识别每一个控件,以便以后可以找到它?找到控件不是tcat.Tag的问题,而是根据对底层数据表的更改而更改的控件顺序。目前,我们正在清除所有控件并根据新的顺序重建它们,我想问的是如何阻止清除/重建步骤,而只是移动控件。也许您可以使用FlowLayoutPanel忽略已接受的答案,并使用示例查看第二个答案。