문제

ObjectDataSource(objStudentDetails)에 바인딩되는 Gridview가 있습니다.Gridview의 편집/삽입 모드에서 필드 중 하나는 조회 테이블에서 선택 목록 옵션을 가져오는 DropDownList입니다.조회 테이블을 나타내는 다른 ObjectDataSource 컨트롤(objStateList)에 이 DropDownList 바인딩이 있습니다.적어도 비어 있지 않은 문자열 값의 경우 objStudentDetails ObjectDataSource의 값이 objStateList ObjectDataSource의 값 중 하나와 일치하는 한 제대로 작동합니다.

objStateList에는 다음 값이 있습니다(로드하는 저장된 proc에서 - ID#6은 빈 문자열 ''임).

StateId     State
----------- -----
6             
4           AL
1           GA
3           KY
2           TN

objStudentDetails에는 다음 값이 있습니다(로드하는 저장된 proc에서):

FirstName   LastName   State
----------- ---------- -----
tone        smith      TN

또는 다음 결과 집합을 가질 수 있습니다(상태는 빈 문자열 - '').

FirstName   LastName   State
----------- ---------- -----
jenny       johnson     

첫 번째 objStudentDetails 결과 집합에서는 EditItemTemplate의 DropDownList 상태가 정상적으로 표시됩니다.그러나 두 번째 결과 집합에서는 다음 오류가 발생합니다.

'ddlEditState' has a SelectedValue which is invalid because it does not exist in the list of items.
Parameter name: value 

조회 테이블에 빈 문자열이 있는 값이 있으므로 상태에 대해 빈 문자열이 있는 objStudentDetails 값이 일치할 것이라고 생각하지만 뭔가 예상한 대로 작동하지 않습니다.

다음은 Gridview의 EditItemTemplate 코드입니다.

<EditItemTemplate>
  <asp:Panel ID="panEditState" runat="server">
    <asp:DropDownList ID="ddlEditState" runat="server" CssClass="GridviewDropdownlist"
      DataSourceID="objStateList" DataTextField="State" DataValueField="State"      
      SelectedValue='<%# Bind("State") %>'
      Width="50px">
</asp:DropDownList>
</asp:Panel>
</EditItemTemplate>

그리고 쿼리할 조회 테이블의 매개 변수를 전달하는 메서드를 호출하는 objStateList는 다음과 같습니다.

<asp:ObjectDataSource ID="objStateList" runat="server" SelectMethod="GetDropdownData"     TypeName="AIMLibrary.BLL.DropdownData">
<SelectParameters>
<asp:Parameter Name="itemsToGet" DefaultValue="state" />
</SelectParameters>
</asp:ObjectDataSource>

어떤 아이디어가 있나요?

도움이 되었습니까?

해결책

DropdownLists의 부록 부록 속성을 True로 설정하여 시작하십시오. 다음으로 다음을 추가하여 Null Listitem을 추가하십시오. <asp:ListItem> 선언적 마크 업이 다음과 같이 보이도록 각 드롭 다운 목록에 요소 :

<asp:DropDownList ID="Categories" runat="server"
    DataSourceID="CategoriesDataSource" DataTextField="CategoryName"
    DataValueField="CategoryID" SelectedValue='<%# Bind("CategoryID") %>'
    AppendDataBoundItems="True">
    <asp:ListItem Value="">[nothing selected]</asp:ListItem>
</asp:DropDownList>

다른 팁

이 오류를 일으킬 수있는 다양한 시나리오가 있다고 생각합니다. 제 경우에는 템플릿 필드에 드롭 다운이있었습니다. 드롭 다운은 자체 ObjectDatasource에 묶여 있었고 SelectedValue 속성은 GridView의 (별도) 데이터 소스에서 필드에 묶여있었습니다.

이제 특정 시나리오에서 문제는 인종 조건이었습니다. GridView의 데이터 소스는 드롭 다운이 차례가되기 전에 채워지고 구속되었습니다. 이것은 또한 드롭 다운 항목이 자체 바인딩을 통해 생성되기 전에 Dropdowns 'SelectedValues가 설정되었음을 의미했습니다.

더 나은 솔루션이 있어야한다고 확신하지만 연구 할 시간이 많지 않았습니다. GridView와 Dropdowns를 데이터 소스 (즉, 디자이너의 과제를 제거)에서 연결 해제하고 프로그래밍 방식으로 바인딩했습니다. 이렇게하면 드롭 다운을 명시 적으로 바인딩하여 GridView 자체가 바인딩 될 때 항목 값을 사용할 수 있도록 할 수 있습니다.

여태까지는 그런대로 잘됐다. page_load에서 몇 줄의 추가 코드 라인 만

AppendDataBoundItems="True">는 작동하지만 모든 경우에 작동하지는 않습니다.GridView 내에서 드롭다운 목록을 만드는 것은 여전히 ​​Microsoft가 해결해야 할 미스터리입니다.개발은 ASP가 PHP보다 훨씬 빠르다고 합니다.음 오늘이 3일째인데 작은 문제가 발생하고 아직 해결책이 없습니다.

좋아, 이것은 일반적인 문제이기 때문에 실제로 답을 게시 할 가치가 있다고 생각합니다. 많은 주변을 둘러 보면 두 가지 솔루션이 있습니다.

  1. 패치 : DDL 설정을 설정하십시오 AppendDataBoundItem=true Anda 목록에 수동으로 하나의 요소를 추가합니다 (예 : "널 값으로"선택하십시오) :

    <asp : dropdownlist id = "dropdownlist5 runat ="server "appenddatabounditems ="true "...> <asp : listitem> < /asp : listitem> < /asp : dropdownlist>를 선택하십시오.

이것은 약 80%의 경우에 작동하는 것 같습니다. 다른 매개 변수의 다른 값을 허용하기 위해 DDL에서 사용하는 기존 (및 작업) 쿼리를 업그레이드해야 할 때 이상한 상황이있었습니다. SELECT ID, Name from EMPLOYEES where Department =@Department 그리고 원래 @Department "물류"를 추가 한 후 "플래너"및 "워크샵"과 동일 할 수 있습니다. DDL은 새로운 부서의 가치에 대해서만 신비하게 작동하지 않았습니다.

  1. 적절한 해결책 : GridView_RowDataBound 이벤트 (감사합니다 이 기사

내 매개 변수는 레이블에서 텍스트로 사용됩니다 (다른 곳에서 설정)

    protected void GridView5_RowDataBound(object sender, GridViewRowEventArgs e)
    {

    //********** this  is a workaround for the annoying problem with dropdownlist in gidview without adding new item ************
    if (e.Row.RowType == DataControlRowType.DataRow && GridView5.EditIndex == e.Row.RowIndex)
    {
        DropDownList DropDownList5 = (DropDownList)e.Row.FindControl("DropDownList5");
        string query = "SELECT gkey as empID, name FROM [employees] where department=@department";
        SqlCommand command = new SqlCommand(query);
        command.Parameters.AddWithValue("@department", lblDepartment.Text);
        DropDownList5.DataSource = GetData(command);
        DropDownList5.DataTextField = "name";
        DropDownList5.DataValueField = "empID";
        DropDownList5.DataBind();
    }

그리고 getData 메소드 :

   private DataTable GetData (SqlCommand cmd)
{
    string strConnString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
    using (SqlConnection con = new SqlConnection(strConnString))
    {
        using (SqlDataAdapter sda = new SqlDataAdapter())
        {
            cmd.Connection = con;
            sda.SelectCommand = cmd;
            using (DataTable dt= new DataTable())
            {
                sda.Fill(dt);
                return dt;
            }
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top