C#:从组合框到下拉列表的问题
本文关键字:下拉列表 问题 组合 | 更新日期: 2023-09-27 17:58:31
我对编程还很陌生,我相信我的问题会显示出来。在过去的两天里,我完全陷入了困境,我在任何地方都找不到答案。可能是因为我忽略了一些显而易见的事情,没有人会问,但事实是:
我在VS Express 2013中为windows制作了一个应用程序,用户可以从只显示对象名称的组合框中选择一个替代选项。从选择中,我将整个对象发送到我的"转换器类"。
EU = new Converter("Enriched Uranium", "44");
CO = new Converter("Coolant", "9832");
BI = new Converter("Biocells", "2329");
CB = new Converter("Construction Blocks", "3828");
FR = new Converter("Fertilizer", "3693");
GL = new Converter("Genetically Enhanced Livestock", "15317");
object[] myArray1 = { EU, CO, BI, CB, FR, GL };
comboBox1.DisplayMember = "name";
节目中大约有50个这样的节目。第一部分是名称,另一部分是XML用来查找内容的ID。他们在代码中进一步执行了很多内容,但这是开始:
Converter a = ((Converter)comboBox1.SelectedItem);
a.CallXml();
a.taxPrice(comboBox2.Text);
a.getNumber(textBox4.Text);
a.getTax(taxrat);
等等……我知道它并不完全漂亮,我看到了很多方法,让它在学习后更有效。但现在我专注于将整个东西转换为一个网站,并使用VSExpress2013进行web。
那里没有组合框,所以我一直在使用下拉列表。上面用"AddRange"加载列表的方法没有起作用,并且ive trid大约有一百个东西,直到我最终以这种方式显示名称:
List<object> myList1 = new List<object>();
myList1.Add(EU);
myList1.Add(CO);
myList1.Add(BI);
DropDownList2.DataSource = myList1;
DropDownList2.DataTextField = "name";
DropDownList2.DataBind();
到目前为止一切都很好!我现在完全陷入困境的地方是,我需要用户选择返回对象并将其发送到"Converter"类。这是我感觉到的结束:
protected void Button1_Click(object sender, EventArgs e)
{
object a = (Converter)DropDownList2.SelectedItem;
}
上面写着:"无法将类型blablabla转换为WebApplication4.Converter。怎么会这样?有什么方法可以让它执行与旧winform中的combobox相同的操作吗?
我想做的是,当用户选择"浓缩铀"时,程序会调用"Converter类",例如:
EU.CallXml();
等等。
欢迎来到web开发和整个无状态请求/响应机制的世界。要充分理解这一点,请阅读windows和web开发之间的差异。
在webforms中,控件比winforms的控件基本得多。实际上,绑定只是一种方式——它只是使用源数据来获取绘制列表所需的信息。如果你仔细想想,它必须是这样的,否则它将不得不在服务器和客户端浏览器之间传递整个对象列表,这将是浪费,而且在无状态环境中很难知道何时绑定等。
Web表单Dropdownlist.SelectedItem的类型为ListBoxItem,它只包含绘制和从Dropdownlist控件获取项目所需的最小字段,只包含ListItem中的文本,以及是否选中它。这就是为什么你不能把它投射回你的转换器对象。
那么,如何将所选项目映射回您的转换器?您可以使用字符串值Dropdownloadist.SelectedItem.value进行某种查找,也可以使用Dropdownloadist.FelectedIndex在该索引处从源列表中查找项目。
你可以做一些类似的事情
List<Converter> myList1 = GetConverters(); //todo - write a method to make the list
DropDownList2.DataSource = myList1;
DropDownList2.DataTextField = "name";
DropDownList2.DataBind();
以及点击事件
protected void Button1_Click(object sender, EventArgs e)
{
string s = DropDownList2.SelectedItem.Value;
Converter c = GetConverters().Find(x => x.name == s);
//do whatever with the converter
}
免责声明-这些都没有经过编译-因此可能会有一些错误。此外,这绝对不是最好的方法(没有错误检查+只为进行数据源绑定而列出转换器列表有点浪费),只是为了向您展示如何做到这一点。
另一个警告-确保只进行一次数据源绑定-如果您在没有检查页面是否已返回的情况下进行绑定,则可能会在尝试获取值之前进行绑定-这意味着第一个值似乎总是被选中的。祝你好运