привязка данных с несколькими строками к выпадающему списку

#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 с соответствующими темами в выпадающем списке:

введите описание изображения здесь