重构,基于selectedIndexChanged事件改变DataSource类型,C#

问题描述:

我正在处理一个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

使用泛型:

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