我有一个包含两个字段的数据库表MainAccount和MainDescription表具有以下数据MainAccount 10 MainDescription Capital,MainAccount 20 MainDescription帐户可用,MainAccount 30 MainDescription应付帐款
我有一个带有DropDownList的asp.net页面和一个文本框。我想在这里获取DropDownList中的所有数据是我的代码
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
using (SqlDataAdapter adapter = new SqlDataAdapter("select distinct MainAccount,MainDescription from chart", db.con))
{
DataTable datatable = new DataTable();
adapter.Fill(datatable);
List<ListItem> list = new List<ListItem>();
foreach (DataRow dr in datatable.Rows)
{
string descr = string.Format("{0} | {1}", dr[0].ToString(), dr[1].ToString());
list.Add(new ListItem(descr));
}
list = list.OrderBy(a => a.Text).ToList();
DropDownList1.DataSource = list;
DropDownList1.DataBind();
}
}
}
此代码可以正常显示DropDownList中的所有MainAccount和Main Description。
这就是我现在所拥有的:
这就是我要找的结果:
答案 0 :(得分:0)
要获得第二张图片的结果,我已经尝试过这个例子,请看下面的两张图片。
添加属性类
public class Columns
{
// obviously you find meaningful names of the 2 properties
public string MainAccount { get; set; }
public string MainDescription { get; set; }
public string Concatenate {get ; set ;}
}
然后
if (!IsPostBack)
{
using (SqlDataAdapter adapter = new SqlDataAdapter("select distinct MainAccount,MainDescription from chart", db.con))
{
DataTable datatable = new DataTable();
adapter.Fill(datatable);
List<Columns> list = new List<Columns>();
foreach (DataRow dr in datatable.Rows)
{
list.Add(new Columns { MainAccount =dr[0].ToString() ,
MAinDescription = dr[1].ToString(),
Concatenate = string.Format("{0} | {1}",dr[0].ToString(), dr[1].ToString())});
}
list = list.OrderBy(a => a.MainAccount).ToList();
DropDownList1.DataSource = list;
DropDownList1.DataValueField = "MainDescription";
DropDownList1.DataTextField = "Concatenate";
DropDownList1.DataBind();
}
}
然后使用下拉列表的on SelectedIndexChanged属性并设置文本框值。 示例我只是在下面运行。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace DropDown
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
List<Columns> list = new List<Columns>();
for (int i = 0; i < 10; i++)
{
list.Add(new Columns
{
MainAccount = "1" + i,
MainDescription = "Main Account Desc" + i,
Concatenate = string.Format("{0} | {1}", "1" + i, "Main Account Desc" + i)
});
}
DropDownList1.DataSource = list;
DropDownList1.DataValueField = "MainDescription";
DropDownList1.DataTextField = "Concatenate";
DropDownList1.DataBind();
}
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
TextBox1.Text = DropDownList1.SelectedValue.ToString();
}
}
}
以下是生成的图像。
第二张图片
此外,我注意到您在选择后将组合框文本更改为mainAccount。只是为了让你知道你不能将组合框文本重置为列表中不存在的项目。但是我建议你使用公共数组或结构,填充你的数组onload,然后再从数组中填充你的列表。选择后,您可以从阵列/列表中刷新下拉列表,并将datatextfield重置为mainAccount列。然后将所选内容设置为MainDescription列=文本框文本的行。我希望这有帮助。如果您需要更多帮助,请告诉我们?
答案 1 :(得分:0)
您可以将MainAccount(即10,20,30,40)绑定到下拉列表。 在选定的索引更改中,您可以显示MainDescription。 像这样 -
DataRow [] drDesc = dt.Select(filter expression)
答案 2 :(得分:0)
我认为最好的解决方案可能是创建一个包含两个变量定义的类,并通过此类的列表设置DropDownlist的数据源
public class DropDownDataSource
{
public string Text { set; get; }
public string Value { set; get; }
}
然后我们将修改您的代码以使用新的方式
List<DropDownDataSource> list = new List<DropDownDataSource>();
foreach (DataRow dr in datatable.Rows)
{
var item = new DropDownDataSource
{
Text = dr[0].ToString() + " | " + dr[1].ToString(),
Value = dr[1].ToString()
};
list.Add(item);
}
DropDownList1.DataSource = list;
DropDownList1.DataTextField = "Text";
DropDownList1.DataValueField = "Value";
DropDownList1.DataBind();
并且在DropDownList1的SelectedIndexchanged事件中,我们将编写此代码以带来所选项的值并将其绑定在文本框中
protected void DropDownList1_OnSelectedIndexChanged(object sender, EventArgs e)
{
TextBoxValue.Text = DropDownList1.SelectedValue;
}