#c# #asp.net #webforms
#c# #asp.net #веб-формы
Вопрос:
Из моей базы данных я восстанавливаю таблицу данных, как показано ниже, после выполнения запроса в БД. Я мой asp.net приложение веб-формы У меня есть GridView, и у него есть BoundField и DropDownList.
Я хочу привязать LectureID к BoundField и темам конкретной лекции в выпадающем списке.
Понятия не имею, как выполнить требуемую привязку.
LectureID SubjectName
1 Sub1
1 Sub2
1 Sub3
1 Sub4
2 Sub1
2 Sub4
Комментарии:
1. Вы проверили ответы?
Ответ №1:
<asp:GridView ID="grdvDetail" runat="server">
<Columns>
<asp:BoundField HeaderText="LectureID" DataField="LectureID" SortExpression="LectureID">
<HeaderStyle HorizontalAlign="Center" />
<ItemStyle Font-Size="11px" />
</asp:BoundField>
<asp:TemplateField>
<ItemTemplate>
<asp:DropDownList ID="ddlSubject" runat="server">
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataTable dt = new DataTable();
//Fill DataTable Using SQL Query
grdvDetail.DataSource = dt;
grdvDetail.DataBind();
for (int i = 0; i < grdvDetail.Rows.Count; i )
{
DropDownList ddlSubject = ((DropDownList)grvProduct.Rows[i].FindControl("ddlSubject"));
DataTable dtDDL = new DataTable();
//Fill DataTable Using SQL Query
ddlSubject.DataSource = dtDDL;
ddlSubject.DataTextField = "SubjectName";
ddlSubject.DataValueField = "SubjectName";
ddlSubject.DataBind();
}
}
}
Ответ №2:
Может быть, это не идеальное решение. Идея состоит в том, чтобы создать коллекцию ключей и значений из заданных данных.
Dictionary
Коллекция используется для хранения идентификатора лекции as Key
и связанных с ней тем в List<string>
as Value
.
GridView есть bind with Dictionary
, и в RowDataBound event
GridView каждый dropdownlist
заполняется по мере необходимости.
Разметка:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
onrowdatabound="GridView1_RowDataBound">
<Columns>
<asp:BoundField DataField="Key" HeaderText="Lecture ID" />
<asp:TemplateField HeaderText="Subject Name">
<ItemTemplate>
<asp:DropDownList ID="ddlSubject" runat="server" >
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Код, лежащий в основе:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//test data
DataTable dt = new DataTable();
dt.Columns.Add("LectureID", typeof(int));
dt.Columns.Add("SubjectName");
dt.Rows.Add(1, "Sub1");
dt.Rows.Add(1, "Sub2");
dt.Rows.Add(1, "Sub3");
dt.Rows.Add(1, "Sub4");
dt.Rows.Add(2, "Sub1");
dt.Rows.Add(2, "Sub4");
dt.AcceptChanges();
//Bind with GridView with Dictionary collection
GridView1.DataSource = GetDictionary(dt);
GridView1.DataBind();
}
}
//get a dictionary of distinct lectureID
private Dictionary<int, List<string>> GetDictionary(DataTable dt)
{
var dictionary = new Dictionary<int, List<string>>();
foreach (DataRow dr in dt.Rows)
{
int iKey = Convert.ToInt32(dr["LectureID"]);
if (dictionary.ContainsKey(iKey))
{
List<string> lst = dictionary[iKey] as List<string>;
lst.Add(dr["SubjectName"].ToString());
dictionary[iKey] = lst;
}
else
{
var lst = new List<string>();
lst.Add(dr["SubjectName"].ToString());
dictionary.Add(iKey, lst);
}
}
return dictionary;
}
Событие привязки к данным строки:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow amp;amp;
e.Row.DataItem != null)
{
DropDownList ddl = e.Row.FindControl("ddlSubject") as DropDownList;
ddl.DataSource = ((KeyValuePair<int, List<string>>)e.Row.DataItem).Value;
ddl.DataBind();
}
}
Результат, отличный от LectureID с соответствующими темами в выпадающем списке: