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

#c# #data-binding #drop-down-menu #repeater

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

Вопрос:

Я добавляю выпадающий список внутри моего ретранслятора. Теперь мне нужно установить выбранное значение для моего выпадающего списка.. но я не очень успешен..

 private void PhysicianSource()
{
    DataSet ds = new DataSet();
    DataTable dt = ds.Tables.Add("Source");
    dt.Columns.Add("ID", Type.GetType("System.String"));
    dt.Columns.Add("Desc", Type.GetType("System.String"));

    Provider oProvider = new Provider();
    List<ProviderLabel> lstprovider = oProvider.RetrievePhysicianList();
    foreach (ProviderLabel item in lstprovider)
    {
        DataRow dr = dt.NewRow();
        dr[0] = item.ProviderCode.ID.ToString();
        dr[1] = item.Name.ToString();
        dt.Rows.Add(dr);
    }

    drpPhysicianCode.DataSource = ds;
    drpPhysicianCode.DataMember = "Source";
    drpPhysicianCode.DataTextField = "ID";
    drpPhysicianCode.DataValueField = "ID";
    drpPhysicianCode.DataBind();
}
  

asp.net

 <asp:Repeater ID="rptrPatientList" runat="server" >
    <HeaderTemplate></HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td class="style2">
            <asp:DropDownList  ID="DropDownList1"
                DataTextField="ID" runat="server"
                DataValueField="Desc"
                SelectedValue='<%# Eval("Code") %>'
                DataSource="ds">
            </asp:DropDownList>
            </td>

            </td>
        </tr>
  

в моих кодах ничего не происходит.. помогите мне, ребята, я всего лишь новичок в этом .. большое вам спасибо..

Комментарии:

1. @ian-ace Code в коде PhysicianSource метода, который вы показали здесь, нет !?! итак, как вы получите <%# Eval("Code") %>

2. В кодировке, которую вы используете drpPhysicianCode , но в вашем aspx-коде вы показали код DropDownList1 . Пожалуйста, покажите соответствующий код

Ответ №1:

Привет, Ян Эйс, лучше немного изменить ваш код

  <asp:Repeater ID="rptProductList" runat="server" OnItemDataBound="rptProductList_ItemDataBound">
 <ItemTemplate> 
<asp:DropDownList runat="server" ID="MyRepeater" AutoPostBack="true" OnSelectedIndexChanged="DropDownList_SelectedIndexChanged" >
</asp:DropDownList>
 </ItemTemplate>
 </asp:Repeater>
  

Теперь код, лежащий в основе, должен быть

   protected void Page_Load(object sender, EventArgs e)
  {
     if (!IsPostBack)
    {
       fillRepeater();
    }
  }


}
protected void rptProductList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        DropDownList MyDropDown= (DropDownList)e.Item.FindControl("MyRepeater");
        if (MyDropDown!= null)
        {
           MyDropDown.DataSource =   fillDropDown(MyDropDown);
            MyDropDown.DataBind();
        }
    }
}




 private DataSet fillDropDown(DropDownList dropDown)
    {
     // get  your collection and return.
    }

protected void DropDownList_SelectedIndexChanged(object sender, EventArgs e)
{
    DropDownList MyDropDown= (DropDownList)sender;
    string item = MyDropDown.SelectedValue;
}
  

надеюсь, приведенный выше пример поможет.

Комментарии:

1. Пожалуйста, перейдите в режим отладки и проверьте, входит ли управление в событие DropDownList_SelectedIndexChanged.

2. здесь код findcontrol содержит ошибку, он выдаст исключение, если приведение типа завершится неудачей

Ответ №2:

  1. Попробуйте установить выбранное значение после привязки данных
  2. Не устанавливайте содержимое списка при каждой обратной передаче. Проверьте наличие страницы.IsPostBack(). Обратите внимание, что это работает, только если у вас включен ViewState.

Ответ №3:

 //Declare Class Scoped DataSet and DataTable variables
DataSet ds;
DataTable dt;

//Bind repeater and DataSource method
private void PhysicianSource()
{
    ds = new DataSet();
    dt = ds.Tables.Add("Source");
    dt.Columns.Add("ID", Type.GetType("System.String"));
    dt.Columns.Add("Desc", Type.GetType("System.String"));

    Provider oProvider = new Provider();
    List<ProviderLabel> lstprovider = oProvider.RetrievePhysicianList();
    foreach (ProviderLabel item in lstprovider)
    {
        DataRow dr = dt.NewRow();
        dr[0] = item.ProviderCode.ID.ToString();
        dr[1] = item.Name.ToString();
        dt.Rows.Add(dr);
    }

    drpPhysicianCode.DataSource = ds;
    drpPhysicianCode.DataMember = "Source";
    drpPhysicianCode.DataTextField = "ID";
    drpPhysicianCode.DataValueField = "ID";
    drpPhysicianCode.DataBind();
}

//Repeater Item Data Bound event in which we would find Controls to be bound
//and set DataSource and SelectedValue
protected void rptrPatientList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        DropDownList DropDownList1 = e.Item.FindControl("DropDownList1") as DropDownList;
        if (DropDownList1 != null)
        {
           DropDownList1.DataSource = dt;
           DropDownList1.DataBind();

           DropDownList1.SelectedValue = // DataBinder Eval 'Code' //;
        }
    }
}


<asp:Repeater ID="rptrPatientList" runat="server" OnItemDataBound="rptrPatientList_ItemDataBound">
    <HeaderTemplate></HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td class="style2">
            <asp:DropDownList  ID="DropDownList1"
                DataTextField="ID" runat="server"
                DataValueField="Desc"
                SelectedValue='<%# Eval("Code") %>'
                DataSource="ds">
            </asp:DropDownList>
            </td>

            </td>
        </tr>
  

Ответ №4:

Проблема возникает из-за того, что привязка выпадающего списка происходит после привязки элемента управления repeater. Вы можете использовать пользовательские атрибуты HTML5, чтобы преобразовать значение выпадающего списка в пользовательский атрибут, а затем установить его как выбранное значение после привязки выпадающего списка к данным. Я привязал выпадающий список, используя asp:ObjectDataSource

ASPX

 <asp:Repeater ID="rptrPatientList" runat="server" >
    <HeaderTemplate></HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td class="style2">
            <asp:DropDownList  ID="DropDownList1"
                DataTextField="ID" runat="server"
                DataValueField="Desc" 
SetValue='<%# Eval("Code") %>' datasourceid="dsCategory" 
datatextfield="ID" datavaluefield="desc" DataMember = "Source" onprerender="DropDownDataBinding">
            </asp:DropDownList>
<asp:ObjectDataSource ID="dsCategory" runat="server" SelectMethod="PhysicianSource" TypeName="WebApplication.WebForm1" />
            </td>

            </td>
        </tr>
  

CodeBehind

 protected void DropDownDataBinding(object sender, EventArgs e) //Method to set the selected value on Category dropdown inside repeater
{
    DropDownList sel = (DropDownList)sender;
    sel.Value = sel.Attributes["SetValue"];
    ListItem li = new ListItem("<< Select >>", "");
    sel.Items.Insert(0,li);
}

protected DataSet PhysicianSource()
{
        DataSet ds = new DataSet();
DataTable dt = ds.Tables.Add("Source");
dt.Columns.Add("ID", Type.GetType("System.String"));
dt.Columns.Add("Desc", Type.GetType("System.String"));

Provider oProvider = new Provider();
List<ProviderLabel> lstprovider = oProvider.RetrievePhysicianList();
foreach (ProviderLabel item in lstprovider)
{
    DataRow dr = dt.NewRow();
    dr[0] = item.ProviderCode.ID.ToString();
    dr[1] = item.Name.ToString();
    dt.Rows.Add(dr);
}
return ds;
}