[英]Strange VS2010 behavior with datagrid and designer
我正在使用帶有DataGridView控件的winforms應用程序,我遇到了一些令人沮喪的事情。
首先,我想關閉AutoColumnGeneration,但它沒有在屬性中列出。 沒問題,我可以用一行代碼做到這一點......這就是它變得奇怪的地方:
在我的代碼中,DataGridView無法訪問。 它就像在表格上不存在一樣。 考慮到這一點,因為設計者將其聲明為InitializeComponent()方法的一部分,而不是初始化所有其他控件的地方。
因為它在設計師中,我所做的任何改變都會被顛倒,所以我無法解決這個問題。
有沒有辦法阻止視覺工作室這樣做? 我通過使用其中一個datagrid列(可訪問的ARE)來創建對其關聯的datagridview的引用並以此方式訪問它。 它有效,但它的丑陋和根本不直觀。
我想我找到了:
在設計器中,單擊DataGridView控件,並將GenerateMember
的屬性更改為true。 我猜它被設置為假。
該屬性用於執行此操作:從代碼窗口隱藏控件。 它對於您不需要在代碼中處理的Labels或ToolStripSeparators非常有用。
我個人使用綁定源作為數據源,它甚至可以是一個對象,然后在列下它將列出所有可用列,您可以選擇哪些可見,以及一系列其他選項,包括格式。
單擊數據源上的下拉列表並添加新數據源,然后選擇必要的對象,在我的示例中為訂單詳細信息對象。 這是我的一些設計師代碼,由VS2010創建
this.dgvOrderDetails.DataSource = this.orderDetailBindingSource;
this.orderDetailBindingSource.DataSource = typeof(OrderDetail);
設置數據以填充datagridview的綁定源代碼(我編寫了這部分)
orderDetailBindingSource.DataSource = orderDetList;
然后只需單擊datagridview的Columns屬性上的省略號,它將列出對象中可用的所有列,並設置我想要的列,順序,格式等。
至於第二個問題,一旦你使用設計師進行上面列出的更改,我認為你不會遇到這個問題。
在我的例子中,我在Form的部分類(我的代碼的文件,而不是Designer的文件)中聲明了一個私有屬性,通過在Controls層次結構中導航來返回控件。
private DataGridView MyGrid
{
get { return (DataGridView)this.Controls[0].Controls[1].Controls[0].Controls[1].Controls[0]; }
}
我同意,應該有更好的方法,例如Visual Studio Designer聲明控件就像它對表單上的大多數其他控件一樣。 與此同時,這是有效的。
警告!
如果更改了表單的控件層次結構,則必須手動更新屬性的定義。
編輯
我有一個更好的解決方案 - 至少在Visual Studio 2012中。
在Designer的形式中,選擇DataGridView,打開其屬性並查找GenerateMember
屬性(在Design節點下)並確保將其設置為True
。 設置為True
,Designer將為DataGridView控件聲明成員變量。
奇怪的是,默認值似乎是True
,所以我很好奇它是如何更改為False
? 也許我在設置名稱時錯誤點擊了?
順便說一下,@ LarsTech的回答與此次更新相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.