请教一个关于dropdown list的问题

wolai66 2019-01-25 10:02:01
因为要规范输入,所以要把原来有文本框输入的字段,改成用dropdown list,对于改变后新输入的记录没有问题,但是原来的历史数据,因为文本框输入很不规范,变成dropdown后,dropdown里面没有的item,显示就出现问题,总是默认显示成dropdown第一个选项。请教对于这种情况,应该如何解决。多谢。
...全文
1165 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
如果你是输出的问题(而不是提交值的问题),那么应该确保 Items 绑定的值列表有所有可能的提交值。例如一个“尺寸”字段你设置为10种固定尺寸,但是数据库中原本还有20种尺寸不在这10种固定尺寸之内,那么你的 DropdownList 要么给用户显示下拉30种尺寸(或者例如改为用输入进行动态筛选的下拉框),要么就改变 UI 设计思路而不能仅仅基于 DropdownList。总之你不能只给 DropdownList 绑定残缺的项目。
代号六零一 2019-02-21
  • 打赏
  • 举报
回复
你的意思是不是下拉后显示不出来之前的数据,这有可能是因为没有 绑定好数据库
  • 打赏
  • 举报
回复
嗯,还有
// System.Web.UI.WebControls.DropDownList
protected virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
	string[] values = postCollection.GetValues(postDataKey);
	base.EnsureDataBoundInLoadPostData();
	if (values != null)
	{
		base.ValidateEvent(postDataKey, values[0]);
		int num = this.Items.FindByValueInternal(values[0], false);
		if (this.SelectedIndex != num)
		{
			base.SetPostDataSelection(num);
			return true;
		}
	}
	return false;
}
// System.Web.UI.WebControls.ListItemCollection
internal int FindByValueInternal(string value, bool includeDisabled)
{
	int num = 0;
	foreach (ListItem listItem in this.listItems)
	{
		if (listItem.Value.Equals(value) && (includeDisabled || listItem.Enabled))
		{
			return num;
		}
		num++;
	}
	return -1;
}
// System.Web.UI.WebControls.ListControl
protected void SetPostDataSelection(int selectedIndex)
{
	if (this.Items.Count != 0 && selectedIndex < this.Items.Count)
	{
		this.ClearSelection();
		if (selectedIndex >= 0)
		{
			this.Items[selectedIndex].Selected = true;
		}
	}
}
当然你要了解 LoadPostData 机制原理,也就是了解 webform,才能知道看哪里。
  • 打赏
  • 举报
回复
专业学习 asp.net 控件都要结合 asp.net 源代码来学习。例如
// System.Web.UI.WebControls.ListControl
[Bindable(true), Browsable(false), DefaultValue(0), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Themeable(false), WebCategory("Behavior"), WebSysDescription("WebControl_SelectedIndex")]
public virtual int SelectedIndex
{
	get
	{
		for (int i = 0; i < this.Items.Count; i++)
		{
			if (this.Items[i].Selected)
			{
				return i;
			}
		}
		return -1;
	}
	set
	{
		if (value < -1)
		{
			if (this.Items.Count != 0)
			{
				throw new ArgumentOutOfRangeException("value", SR.GetString("ListControl_SelectionOutOfRange", new object[]
				{
					this.ID,
					"SelectedIndex"
				}));
			}
			value = -1;
		}
		if ((this.Items.Count != 0 && value < this.Items.Count) || value == -1)
		{
			this.ClearSelection();
			if (value >= 0)
			{
				this.Items[value].Selected = true;
			}
		}
		else if (this._stateLoaded)
		{
			throw new ArgumentOutOfRangeException("value", SR.GetString("ListControl_SelectionOutOfRange", new object[]
			{
				this.ID,
				"SelectedIndex"
			}));
		}
		this.cachedSelectedIndex = value;
	}
}
以及
// System.Web.UI.WebControls.DropDownList
[DefaultValue(0), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), WebCategory("Behavior"), WebSysDescription("WebControl_SelectedIndex")]
public override int SelectedIndex
{
	get
	{
		int num = base.SelectedIndex;
		if (num < 0 && this.Items.Count > 0)
		{
			this.Items[0].Selected = true;
			num = 0;
		}
		return num;
	}
	set
	{
		base.SelectedIndex = value;
	}
}
当你考虑到“当要显示历史记录的时候”的时候,如果你懂 DropdownList,那么你就知道控件根本不知道你(这里应该是还并没有说明的)那种代码。
  • 打赏
  • 举报
回复
引用 3 楼 wolai66 的回复:
可能我描述的不太清楚,比如说,现在DROPDWON LIST里面的值是1,2,3,4,相对应的字段是F1. 原来F1这个字段因为是文本框输入有很多值是 5,6,7,8. 那么,我现在使用dropdown 后,当要显示历史记录的时候,当碰到不包含在1,2,3,4中的值的时候,总是显示1,也就是dropdown list中,第一个选项。
“当要显示历史记录的时候”这个描述根本看不出你说的是怎么显示的。DropdownList 并没有什么“历史记录”机制,所以你需要描述你自己的东西。 DropdownList 在服务器端收到了客户端提交的 value(也就是选择的值)之后,并不保证会返回这个值,而是用这个值从后台绑定的 Items 中去比对,找到了匹配的则 SelectedText/SelectedValue 才是这个值,否则就是第一个选项。这是 DropdownList 的标准设计,你可以查一下文档或者 DropdownList 的编程讨论看到这个机制的说明。
krzg2008 2019-02-20
  • 打赏
  • 举报
回复
3种方式解决这个问题: 1.update数据库的f1字段,把5678改成1234 2.dropdownlist的数据源增加5678 3.让用户自己手动编辑原来的5678,按照5楼的方式
大然然 2019-01-29
  • 打赏
  • 举报
回复
ListItem item = new ListItem();
item.Text = "默认值";
item.Value = "1";
DropDownList1.Items.Insert(0,item);


遍历你的历史记录,不包含在1,2,3,4中的值的时候,把他的值赋为1,然后绑定就可以了

wolai66 2019-01-25
  • 打赏
  • 举报
回复
可能我描述的不太清楚,比如说,现在DROPDWON LIST里面的值是1,2,3,4,相对应的字段是F1. 原来F1这个字段因为是文本框输入有很多值是 5,6,7,8. 那么,我现在使用dropdown 后,当要显示历史记录的时候,当碰到不包含在1,2,3,4中的值的时候,总是显示1,也就是dropdown list中,第一个选项。
  • 打赏
  • 举报
回复
解决什么?显示历史数据有什么错?操作下拉时显示规范的选项又有什么错?
独立观察员 2019-01-25
  • 打赏
  • 举报
回复
引用 3 楼 wolai66 的回复:
可能我描述的不太清楚,比如说,现在DROPDWON LIST里面的值是1,2,3,4,相对应的字段是F1. 原来F1这个字段因为是文本框输入有很多值是 5,6,7,8. 那么,我现在使用dropdown 后,当要显示历史记录的时候,当碰到不包含在1,2,3,4中的值的时候,总是显示1,也就是dropdown list中,第一个选项。


你在最顶上显示一个空值(或者比如说0)吧

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧