У меня есть таблица базы данных с двумя полями MainAccount и MainDescription table имеют следующие данные MainAccount 10 MainDescription Capital, MainAccount 20 MainDescription Account Receiable, MainAccount 30 MainDescription Account Payable
У меня есть страница asp.net с DropDownList и текстовое поле. Я хочу получить все данные в 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();
}
}
}
этот код работает отлично, чтобы отображать все MainAccount и Main Description в DropDownList.
Это то, что у меня есть сейчас:
И это результат, который я ищу:
Чтобы получить второй результат изображения, я попробовал это с примером, см. Два изображения ниже.
Добавить класс свойства
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();
}
}
Затем используйте свойство 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();
}
}
}
Ниже приведено изображение.
Второе изображение
Также я заметил, что вы изменили текст combobox на mainAccount после выбора. Чтобы сообщить вам, что вы не можете просто сбросить текст combobox к элементу, который не существует в списке. Однако я предлагаю вам использовать открытый массив или структуру, заполнить ваш массив onload, а затем заполнить список из массива. После выбора вы также можете обновить выпадающий список из массива/списка и сбросить поле данных в свой столбец mainAccount. Затем установите выделенную строку в столбец MainDescription = Textbox. Надеюсь, это поможет. Сообщите нам, если вам нужна дополнительная помощь в достижении этого?
я думаю, что лучшим решением может быть создание класса, содержащего определение двух переменных и установки источника данных в 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();
и в событии SelectedIndexchanged DropDownList1 мы напишем этот код, чтобы вывести значение выбранного элемента и bint его в текстовое поле
protected void DropDownList1_OnSelectedIndexChanged(object sender, EventArgs e)
{
TextBoxValue.Text = DropDownList1.SelectedValue;
}
Вы можете связать MainAccount (т.е. 10,20,30,40) с выпадающим списком. И при выбранном изменении индекса вы можете отобразить MainDescription. как this-
DataRow [] drDesc = dt.Select (выражение фильтра)