2017-10-19 93 views
1

我正在處理一個web應用程序。問我的是,當頁面加載時,我的下拉列表顯示索引0,並顯示和存儲特定的屬性。重構,基於selectedIndexChanged事件改變DataSource類型,C#

基於此,還有第二個下拉列表來保存列表。

接下來在selectedIndexChanged事件中,我的索引應該在ddl1(我會調用它)中,ddl2中的數據應該改變。

正在填充的數據全部來自數據庫查詢。

我正在重構過程中,我試圖找到一種方法,以便我可以將一些數據傳遞給bindControls方法。我正在傳遞一個基於布爾值的通用數據類型,這個布爾值也可以傳遞給該方法。

下面是一個例子

IQueryable<BankAccount> accountQuery = db.BankAccounts.Where(x => x.ClientId 
== clientId && x.AccountNumber != accountNumber); 


private void bindControls(DropDownList ddl, string textFieldProp, string 
dataFieldProp, boolean isBillPayment, object dataSource) 
{ 
    //this is where my confusion is... i don't know how to change the type 
    //of the object 
    if(isBillPayment == true) 
     dataSource = typeof(IQueryable<BankAccount>); 
    ddlDataSource = dataSource.ToList() 
    ddlDataTextField = textFieldProp; 
    ddlDataValueField = dataFieldProp; 
    ddl.DataBind(); 
} 

我知道,必須有,我可以將此數據源分配給我想要的東西的一種方式。 我發佈的查詢只是該數據源要發送到的示例,我有來自BankAccounts,TransactionTypes或Payees的三種不同的表查詢。

對不起,我應該提到,我很抱歉,因爲它的任何混淆。也許這使得現在更有意義

+0

您的發佈代碼沒有意義。你爲什麼想改變類型?你爲什麼要向我們展示'accountQuery',但它沒有在你的代碼中使用。 – CodingYoshi

回答

0

使用泛型:

private void bindControls<IQueryable<T>>(DropDownList ddl, string textFieldProp, string 
dataFieldProp, boolean isBillPayment, IQueryable<T> dataSource) 
{ 
    // I don't think you really need this. 
    // if(isBillPayment == true) 
    // dataSource = typeof(IQueryable<T>); 

    ddlDataSource = dataSource.ToList() 
    ddlDataTextField = textFieldProp; 
    ddlDataValueField = dataFieldProp; 
    ddl.DataBind(); 
} 

我會建議鑄造.ToList()更早傳遞,爲您的bindControls()方法,而不是IQueryable

...但我並不真正瞭解爲什麼你這樣做。在我看來,你不需要你的布爾開關。

+0

你是對的...布爾是完全不需要的...我已經嘗試設置IQueryable dataSource,作爲方法參數, 和以後的鑄造.. ddl.DataSource =(IQueryable )dataSource.ToList (); 這看起來像一個體面的方法嗎? – sneufeld

+0

如果使用泛型,則不必從「對象」進行投射。你有'IQueryable '所以你很好 - 除非我誤解。 –

+0

是否有視覺工作室需要使用聲明來識別?這可能看起來像一個新秀評論,但我不斷收到地獄的紅色下劃線,每當我輸入IQueryable ... T下的紅色下劃線...我認爲這是如何被確定爲通用...?我不想用一個問題發表評論,但它與您的回覆有關...... – sneufeld