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 #)

Foi útil?

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 item DropDownList 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 com AppendDataBoundItems="false", seria esvaziado.
  • DataBind é chamado em cada Page_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();
}
gêneros codice tagore

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top