2017-07-14 17 views
0

我習慣於使用HTML應用程序,其中不存在創建組件列表(如電話簿聯繫人)的問題。在WindowsForms中使用大量的UserControl

Example of my app

現在我已經使用Windows窗體此方法。一個面板被填充大量的自定義UserControl(UC)。只有30個用戶控件需要5秒以上的渲染。而來自數據庫的數據列表將返回< 1秒。

此UC只有標籤,PictureBox和Click事件。這就是所謂的。這些數據用於填充子控件。

new UserControl(MyModel data); 

有沒有一種方法可以做到這一點?我想有用戶友好的圖形用戶界面,而不是使用網格佈局。在數據如何顯示給用戶方面,它不是用戶友好的,而且非常有限。

foreach (var data in myDbResult) 
{ 
    var uc = new MyUserControl(data); 
    uc.Dock = DockStyle.Top; 
    resultFlowPanel.Controls.Add(uc); 
} 

... 

public MyUserControl(MyModel data) 
{ 
    this.data = data; 
    InitializeComponent(); 
    label1.Text = data.name; 
    label2.Text = data.address; 
    // get some more data from database 
    using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["AlarmDbCon"].ConnectionString)) 
    { 
     payer = db.Query<Models.g_UserPayer>("SELECT TOP(1) * FROM g_UserPayer WHERE ID_User[email protected]", new 
     { 
      UserID = guard.ID_User 
     }).FirstOrDefault(); 
    } 
    label3.Text = payer.email; 
    PictureBox.Image = payer.image; 
} 
+0

顯示代碼,填充UI的位置。爲什麼網格佈局不友好和有限? C#不是HTML,Grid不是表格 –

+0

它取決於我,我首先從'Control'繼承並自己繪製控件。創建一個用戶控件將會輕很多。 – series0ne

+0

正如我所知道的那樣,網格佈局只能像查看一樣在表格中顯示數據?這是不可能的[鏈接](https://i.stack.imgur.com/RPf9z.png) –

回答

0

如果有自己的UI控件,那麼你應該考慮使用你的Load方法this.SuspendLayout();this.ResumeLayout();方法推遲UI控制的昂貴的UI佈局計算。

您可以使用的另一個方面是將昂貴的數據加載到後臺線程上。爲了能夠做到這一點,您應該使用委託來更新在UI線程上創建的控件。有關這方面的更多信息SO answer

+0

我使用標準的UI控件,如標籤,按鈕...掛起/恢復佈局不起作用。我有一個tabControl,當我切換到與我的大面板充滿了UC的選項卡它也呈現很長時間。 –

+0

我看到了,但是將它們包裝/分組到一個自定義的用戶控件中,對吧? –

+0

您是對的 –

相關問題