DROPDOWNLIST AppendDataBoundItems (primeiro item a ser branco e não há duplicados)
-
06-09-2019 - |
Pergunta
Eu tenho um DropDownList
dentro de um UpdatePanel
que é preenchido no postback de um SqlDataSource
. Ele tem um parâmetro que é um outro controle. Eu às vezes precisa de várias postagens, mas o que acontece é que cada vez que as atualizações painel de atualização, os itens são adicionados à DropDownList
. Assim, as extremidades DropDownList
por ter dados que estão incorrectas ou dados repetidos.
Eu tenho o conjunto de propriedades AppendDataBoundItems
para true
porque eu preciso o primeiro item a ser em branco.
Como posso resolver este problema? Existe outra maneira de ter um primeiro item em branco?
(Este é DropDownList
numa aplicação Web ASP.NET 2.0, e Codebehind é em C #)
Solução
Em vez de usar AppendDataboundItems='true'
(que fará com que o problema que você está falando), responder ao evento DataBound
para o DropDownList
e, em seguida, adicionar o seu "em branco" item para o topo da lista.
<asp:DropDownList runat="server" ID="MyList"
ondatabound="MyListDataBound"></asp:DropDownList>
Então, em seu código por trás:
protected void MyListDataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select -", ""));
}
Outras dicas
Há boas respostas aqui, mas eu senti a necessidade de incluir mais informações, pois existem várias opções que funcionam e temos de decidir qual usar.
Em primeiro lugar, devemos entender AppendDataBoundItems
. Se AppendDataBoundItems = "true"
, ListItems
são adicionados ao DropDownList
sem limpar os antigos. Caso contrário, o DropDownList
é limpa sobre antes da próxima DataBind
. MSDN AppendDataBoundItems doc
Existem basicamente 2 opções abrangidas pela maioria das respostas:
1. Definir uma opção em branco em html e adicionar os ListItems do banco de dados para o DropDownList apenas uma vez.
Aviso 3 coisas aqui:
-
ListItem
em branco é definido em html -
AppendDataBoundItems="true"
-
DataBind
não é chamado em postagens ou quando o itemDropDownList
contagem é> 1
Fonte:
<asp:DropDownList ID="MyList" runat="server" AppendDataBoundItems="true" DataValueField="Id" DataTextField="Name" >
<asp:ListItem Text="- Select One -" Value="" />
</asp:DropDownList>
código por trás:
protected void Page_Load(object sender, System.EventArgs e)
{
if (MyList.Items.Count <= 1 ) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
Nota: Eu como a lógica de verificar a contagem vs verificação IsPostBack
. Embora postagens são muitas vezes a causa da ligação de dados duplicados, é possível fazer com que outras maneiras. Verificar a contagem de itens é basicamente apenas verificando para ver se ele já foi carregado.
OR (opção de uso IsPostBack
vez)
protected void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
2. Limpar e recarregar o DropDownList em cada atualização da página.
Notas de 3 diferenças em relação a primeira opção:
-
AppendDataBoundItems="false"
(se não for definida, em seguida,false
é que é valor padrão) -
ListItem
em branco é adicionado atrás código. Não podemos defini-lo em html porque comAppendDataBoundItems="false"
, seria esvaziado. -
DataBind
é chamado em cadaPage_Load
Fonte:
<asp:DropDownList ID="MyList" runat="server" DataValueField="Id" DataTextField="Name"
OnDataBound="MyList_DataBound" >
</asp:DropDownList>
código por trás:
protected void Page_Load(object sender, System.EventArgs e)
{
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
protected void MyList_DataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select One -", ""));
}
Você provavelmente se ligam que DropDownList no trás código. Então você não deve fazê-lo após a postagem novamente:
// probably in Page_Load method
if (!Page.IsPostBack)
{
// do data binding here
};
Aqui está uma idéia, podemos usar 2 eventos: DataBound e DataBinding :
protected void MyListDataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select -", ""));
}
protected void MyListDataBinding(object sender, EventArgs e)
{
MyList.Items.Items.Clear();
}
Aqui está uma idéia.
Há uma propriedade na lista suspensa chamada AutoPostBack
defini-lo como true e, em seguida, no código atrás de você colocar todo o método de ligação dentro do if(!Page.IsPostBack)
. Que funcionou para mim.
cumprimentos.
Apenas Adicionar EnableViewState = "false" para o tag suspensa
<asp:DropDownList runat="server" ID="DropDownList1" DataSourceID="SqlDataSource"
DataTextField="Name" DataValueField="ID" EnableViewState="false"
AppendDataBoundItems="true">
<asp:ListItem Value="">Select</asp:ListItem>
</asp:DropDownList>