winform動態生成窗體並實現傳值返回
目前還在苦逼的折騰練手作,碰到了關於生成窗體和傳值的需求
首先是生成窗體的需求:
首先,首頁有眾多按鈕,都是用來指向各個功能視窗的,一個個是編寫程式碼的話,太麻煩了;
其次,設計一個通用的篩選視窗,給不同的資料表介面進行查詢篩選,在編寫查詢條件時,要給一些專案比較多的欄位提供一個瀏覽查詢功能,同樣需要動態生成窗體……
這個需求倒是挺容易就找到了解決方案,直接貼出程式碼以供參考
string strForm = (sender as Button).Tag.ToString();//我在設計介面裡,已經將每個按鈕的tag填好了需要建立的視窗類名
object[] obj = new object[1] { sqlcon };//我傳了個mysql連線字串,顯然,在呼叫的視窗類裡,需要寫一個相應的建構函式,這個就不必展示了吧
Form form = GetInstance(strForm, obj) as Form;//呼叫下面的那個方法
form.show();
//以上是我寫在二十多個按鈕共同的click事件方法裡的建立視窗程式碼
///這個方法,或者說這裡面的這句程式碼,是關鍵所在
public static object GetInstance(string instanceName, params object[] param)
{
return Assembly.Load(Assembly.GetAssembly(typeof(Index)).GetName().Name).CreateInstance(typeof(Index).Namespace + "." + instanceName, true, BindingFlags.CreateInstance, null, param, System.Threading.Thread.CurrentThread.CurrentCulture, null);
//index,是我的主視窗類名。至於這句程式碼的功能,看VS的提示,雖然很長,但還是挺好懂的
}
這段程式碼我改了改,就拿到了篩選視窗使用。
但接著新的問題就來了,怎麼拿到使用者選擇的返回值?
以下分隔線內是個我沒解決的問題,可以當作是廢話跳過
=====================
我曾經用過中間視窗方案,也就是新增個視窗(myForm),基本什麼都沒有,就是寫入一個私有的string欄位(result),再配上一個公開的獲取方法(Result)。
然後讓所有基本資料視窗繼承這個中間視窗,這樣,當使用者選擇完成後,就用 視窗.Result 拿到返回值。
不幸的是,不知是winform有毒,還是VS有毒(其實我更想說BUG),這個方法經常會這樣:
wuliao就是我做的其中一個基礎資料視窗,繼承中間視窗Form1後,設計器就會出錯誤,折騰多次,依舊沒能搞明白其中的問題所在——曾經用簡單的重啟,就不再提示了,但同樣的方法用第二次就無效了(微軟,你的BUG是聖鬥士級別的麼),依舊報錯
====================
嗯,廢話結束,在確實需要傳回值的情況下,考慮過使用委託,也就是將父視窗方法傳給子視窗,不幸的是,在使用上述的動態新建視窗方法時,VS報錯:方法組不能作為object 傳遞!
抱著試試也不會掉塊肉的想法,我直接把當前視窗(this)作為引數,塞了進去,測試成功——在子視窗將當前視窗標題改寫成功。
於是,就有了下面這個程式碼:
父視窗的方法名略(引數略)
{
前略
string strForm = “視窗名”;
chuandi cd = new chuandi();//建立一個僅用來傳遞返回值的物件
object[] obj = new object[2] { sqlcon ,cd };
Form form = GetInstance(strForm, obj) as Form;
if (form.ShowDialog() == DialogResult.OK)
dataGridView1.CurrentCell.Value = cd.zhi;
}
///僅用來傳遞返回值的物件類
public class chuandi
{
public string zhi { get; set; }
}
///某個基礎資料視窗
public partial class wuliao : Form
{
private chuandi rcd;//宣告物件,準備用來接收
///建構函式
public wuliao(string sqlcon,chuandi cd)
{
InitializeComponent();
rcd = cd;
}
///查詢結束,確定返回值的方法
private void resultGet(string r)
{
rcd.zhi = r;//返回值
this.DialogResult = DialogResult.OK;
this.close();
}
}
目前看來,這個方案還沒發現什麼問題,如有大佬覺得不行,歡迎批評指點
相關文章
- WinForm下實現子窗體ORM
- C#中實現窗體間傳值方法C#
- 窗體傳值 父子窗體傳值情況 c# 1231C#
- Winform MessageBox訊息彈窗如何實現自動關閉ORM
- winform 無邊框窗體實現拖動、最大化、最小化、關閉ORM
- Roslyn 編譯器Api妙用:動態生成類並實現介面ROS編譯API
- WinForm禁止窗體調整ORM
- 滑動視窗最大值的golang實現Golang
- Winform中設定窗體縮小到右下角通知區域並點選後再次顯示窗體ORM
- Winform在主窗體載入前彈出登入窗體ORM
- Solidity中函式返回值,靜態動態陣列Solid函式陣列
- Sharepoint模態窗體(實戰)
- 關於JObject的用法,以及實現動態生成實體物件、動態建立一些Josn組合Object物件
- winform窗體常規設定記錄ORM
- 演算法題:返回滑動視窗中的最大值演算法
- Go語言實現時間滑動視窗演算法 動態計算增加量、最大值、最小值Go演算法
- vue開啟新視窗並且實現傳參,有圖有真相Vue
- 反射的妙用:C#通過反射動態生成型別繼承介面並實現反射C#型別繼承
- winform之在主窗體中不顯示子窗體的選單欄ORM
- struts動態多檔案上傳實現
- 解決winform窗體重複建立問題ORM
- Java連結c++動態庫實現字串的傳輸---簡單的字元拼裝返回JavaC++字串字元
- 【演算法實戰】生成視窗最大值陣列演算法陣列
- SparkSQL介紹並實現開窗函式SparkSQL函式
- C#實現窗體全屏C#
- winform實現委託ORM
- VUE 實現 Studio 管理後臺(四):狀態模式實現視窗停靠,靈動、自由Vue模式
- VUE 父元件動態傳值給子元件Vue元件
- winform 跨視窗點選ORM
- vs2022中windows窗體winform沒有窗體設計器問題處理WindowsORM
- Winform窗體圓角以及描邊完美解決方案ORM
- Spring 呼叫 Stored Procedure 並獲取返回值Spring
- vue js事件方法呼叫api並返回值VueJS事件API
- Winform中使用HttpClient實現呼叫http的post介面並設定傳參content-type為application/json示例ORMHTTPclientAPPJSON
- Mybatis如何動態生成插入的列及批次插入值MyBatis
- 動態渲染之vue頁面向元件間傳值Vue元件
- 記憶(快取)函式返回值:Python 實現快取函式Python
- H5 網站如何實現返回上一頁並自動重新整理H5網站