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