문제

나는있다 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>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top