dropdownlist appendDataboundItems (첫 번째 항목이 비어 있고 복제가 없음)
-
06-09-2019 - |
문제
나는있다 DropDownList
안에 UpdatePanel
a SqlDataSource
. 다른 컨트롤 인 매개 변수가 있습니다. 때때로 여러 포스트 백이 필요하지만 업데이트 패널이 새로 고침 될 때마다 항목이 추가됩니다. DropDownList
. 그래서 DropDownList
잘못된 데이터가 있거나 반복 된 데이터가 있습니다.
나는 이것 가지다 AppendDataBoundItems
속성이 설정되었습니다 true
비워려면 첫 번째 항목이 필요하기 때문입니다.
이 문제를 어떻게 극복 할 수 있습니까? 공백 첫 번째 항목을 갖는 또 다른 방법이 있습니까?
(이것 DropDownList
ASP.NET 2.0 웹 앱에 있고 CodeBehind는 C#에 있습니다.
해결책
사용하는 대신 AppendDataboundItems='true'
(당신이 말하는 문제를 일으킬 것입니다), DataBound
이벤트 DropDownList
그런 다음 "빈"항목을 목록 상단에 추가하십시오.
<asp:DropDownList runat="server" ID="MyList"
ondatabound="MyListDataBound"></asp:DropDownList>
그런 다음 코드 뒤에 :
protected void MyListDataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select -", ""));
}
다른 팁
여기에는 좋은 답변이 있지만 작동하는 여러 가지 옵션이 있고 어떤 사용을 사용해야하는지 결정해야하기 때문에 더 많은 정보를 포함시켜야 할 필요성을 느꼈습니다.
먼저, 우리는 이해해야합니다 AppendDataBoundItems
. 만약에 AppendDataBoundItems = "true"
, ListItems
에 추가됩니다 DropDownList
오래된 것들을 지우지 않고. 그렇지 않으면 DropDownList
다음에 지워집니다 DataBind
. MSDN AppendDataboundItems Doc
대부분의 답변에 포함 된 기본적으로 2 가지 옵션이 있습니다.
1. HTML에서 빈 옵션을 정의하고 데이터베이스의 ListItems를 한 번만 DropdownList에 추가하십시오.
여기에 3 가지를 주목하십시오.
- 공백
ListItem
HTML에서 정의됩니다 AppendDataBoundItems="true"
DataBind
포스트 백 또는시기에 호출되지 않습니다DropDownList
항목 수는> 1입니다
원천:
<asp:DropDownList ID="MyList" runat="server" AppendDataBoundItems="true" DataValueField="Id" DataTextField="Name" >
<asp:ListItem Text="- Select One -" Value="" />
</asp:DropDownList>
뒤에 코드 :
protected void Page_Load(object sender, System.EventArgs e)
{
if (MyList.Items.Count <= 1 ) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
참고 : 카운트 확인 대 확인 논리가 마음에 듭니다. IsPostBack
. Postback은 종종 중복 데이터 밴드의 원인이지만 다른 방법으로 원인이 될 수 있습니다. 항목 수 확인은 기본적으로 이미로드되었는지 확인하기 위해 확인하는 것입니다.
또는 (사용 옵션 IsPostBack
대신에)
protected void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
2. 각 페이지에서 DropdownList를 지우고 새로 고침합니다.
첫 번째 옵션과의 3 가지 차이점 :
AppendDataBoundItems="false"
(정의되지 않은 경우false
기본값인가)- 공백
ListItem
뒤에 코드에 추가됩니다. 우리는 html에서 그것을 정의 할 수 없습니다AppendDataBoundItems="false"
, 그것은 제거 될 것입니다. DataBind
모든 것에 부름받습니다Page_Load
원천:
<asp:DropDownList ID="MyList" runat="server" DataValueField="Id" DataTextField="Name"
OnDataBound="MyList_DataBound" >
</asp:DropDownList>
뒤에 코드 :
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 -", ""));
}
당신은 아마도 해당 드롭 다운 목록을 코드 뒤에 바인딩 할 것입니다. 따라서 Postback 후에 다시하지 말아야합니다.
// probably in Page_Load method
if (!Page.IsPostBack)
{
// do data binding here
};
다음은 아이디어가 있습니다. 우리는 두 가지 이벤트를 사용할 수 있습니다. 데이터 펀드 그리고 데이터 바인딩:
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();
}
<asp:DropDownList ID="DropDownList1" AppendDataBoundItems="true" runat="server"
DataSourceID="SqlDataSource1" DataTextField="state" DataValueField="state">
<asp:ListItem Text="(Select a State)" Value="" />
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:pubsConnectionString %>"
SelectCommand="SELECT DISTINCT [state] FROM [authors]">
</asp:SqlDataSource>
여기 아이디어가 있습니다.
드롭 다운 목록에 부동산이 있습니다. AutoPostBack
그것을 true로 설정 한 다음 뒤에있는 코드에서 모든 바인딩 방법을 내부에 넣습니다. if(!Page.IsPostBack)
. 그것은 나를 위해 일했다.
문안 인사.
그냥 추가하십시오 enableviewstate = "false" 드롭 다운 태그에
<asp:DropDownList runat="server" ID="DropDownList1" DataSourceID="SqlDataSource"
DataTextField="Name" DataValueField="ID" EnableViewState="false"
AppendDataBoundItems="true">
<asp:ListItem Value="">Select</asp:ListItem>
</asp:DropDownList>