2009-12-08 5 views
2

목록에 존재하지 않기 때문에 여기에 시나리오의 유효하지 않은 SelectedValue 있습니다. 시간의 한 지점에서 값을했다 :DropDownList로는 항목

한 두 네 다섯

: 어떤 점 이상에서

한 두 세 네

, 사용할 수있는 값 목록으로 변경

그러나 드롭 다운의 값을 저장하는 DB의 필드에는 여전히 일부 행에 "3"값이 포함되어 있습니다. 그 행 중 하나를로드하고 같은 SelectedValue를 설정하는 경우 : 'DD'이란 항목 목록에 존재하지 않기 때문에 유효하지 않습니다 SelectedValue 있습니다

dd.SelectedValue = data.Field; // where data.Field == "Three" 

을 ... 오류가 나타 발생합니다.

데이터 정리는 여기에 옵션이 아닙니다. 저장된 값은 이미 생성 된 데이터에 대한 유효하지 않은 선택이 아니지만 새로 생성 된 데이터에 대한 유효하지 않은 선택이므로 고객에게 문제가 발생할 수 있습니다.

어떻게 다른 사람이 상황을 처리했다?

답변

6

우리는 여기서 이런 상황을해야합니까.

그런 경우 수동으로 누락 된 항목을 드롭 다운 목록에 빨간색 글꼴로 추가합니다.

사용자가 항목을 다시 저장하려고하면 빨간색 항목은 비활성 상태로 간주되어 유효하지 않습니다. 그런 다음 드롭 다운 목록에서 유효한 선택 사항 (빨간색이 아님)을 선택해야합니다.

+0

감사합니다. 나는이 솔루션이 지금까지 최고라고 생각한다. 다른 많은 답변은이 비즈니스 규칙을 DB (필자가 싫어하는)로 이동 시키거나 현재 값을 표시하지 않고이 상황에서 허용 할 수없는 것이 좋습니다. 이 특정 상황에서는 값이 이전에 생성 된 데이터에 유효하기 때문에 재 저장을 허용합니다. 새 데이터 만이 값을 가져서는 안됩니다. 유효하지 않은 값이 이전 데이터에서만 동적으로 추가된다는 사실은 문제를 충분히 해결합니다. –

1

당신은 참 또는 거짓 일 수있다 '활성'라는 드롭 다운 값을 데이터베이스 테이블에 여분의 열을 추가 할 수 있습니다. 그런 다음 이전 값을 삭제하는 대신 비활성으로 표시하면됩니다. 고객이 여전히 사용하고있는 경우 테이블에서 값을 삭제할 수 없도록 허용 가능한 값 목록에 대한 고객으로부터의 foregin 키 제한을 가져야합니다.

클라이언트에서 비활성 유형을 다른 색상으로 사용하는 고객에게 표시하고 고객을 활성 유형에서 비활성 유형으로 변경할 수없는 검증 방법을 사용할 수 있지만 고객은 비활성 유형을 해당 설정으로 유지합니다.

2

여기에 실제로 문자열을 data.Field을한다 가정하면, 내가 할 것 :

 
ListItem itemToSelect = dd.Items.FindByText(data.Field); 
if(itemToSelect != null) 
{ 
    dd.SelectedItem = itemToSelect; 
} 
+0

지금까지 찾은 최고의 해결책 – alex

+0

니스, +1. 약간 압축 된 버전 :'dd.SelectedIndex = dd.Items.IndexOf (dd.Items.FindByValue (value));'(또한 [this answer] (http://stackoverflow.com/questions/38612/) 참조.) – Merenzo

0

때문에 이전 값은,이 경우 "세"에, 여전히 목록 테이블에 존재하지만 단지 비활성화 또는 제거 테이블에서 전부?

전, 후 두 개의 별도 설치 뷰 활성 항목을 포함하고, 새로운 데이터 엔트리에 사용되는 한, 모든 항목을 포함하고있는 과거 거래를보기 위해 사용되는 하나의 경우.

0

드롭 다운 목록에 "역사적으로 정확한 값이지만 현재 유효하지 않은"값을 추가해야하지만 RequiredFieldValidator을 사용하면 사용자가이 값을 다시 데이터베이스에 저장하지 못하게 할 수 있습니다. RequiredFieldValidator's ControlToValidate을 유효성을 검사하려는 DropDownList으로 설정하면 InitialValue 속성을 잘못된 값으로 설정할 수 있습니다. 이제 저장 방법에서 페이지를 데이터베이스에 저장하기 전에 bool Page.IsValid을 검사 할 수 있습니다. 당신의 RequiredFieldValidator의 메시지가이 도움이 "This value is no longer acceptable due to ..."

희망 같은 것을 할 수 있습니다!

0

또한 DropDownList에 항목이 있는지 먼저 확인한 다음 항목이 없으면 목록에 추가하는 루틴도 있습니다. 위에서 언급 한 Danny와 같은 생각이지만, 나는 빨간색으로 추가하는 그의 추가 아이디어가 마음에 든다. 비록 그 같은 생각이지만, 나는 우리의 전체 일과를 게시하는 것이 중요 할 것이라고 생각했습니다. foreach를 사용하여 목록을 반복하여 값 문자열을 찾습니다. 위의 저스틴처럼 FindByText를 사용하면 더 효율적으로 만들 수 있습니다.

protected bool SafeSetDropDownValue(DropDownList ddl, string value, string text, bool addItemIfNotFound) 
{ 
    // first make sure that drop down list has been data bound so that all the options are in there 
    ddl.DataBind(); 

    // look for value in the list of dropdown values 
    // (can't use try/catch because exception doesn't happen until later) 
    bool found = false; 
    bool selected = true; 
    foreach (ListItem li in ddl.Items) 
    { 
     if (li.Value == value) 
     { 
      found = true; 
     } 
    } 

    if (found) 
    { 
     ddl.SelectedValue = value; 
    } 
    else 
    { 
     // the value wasn't in the list, 
     // so if addItem is true, then add the value to the list and then set the value 
     if (addItemIfNotFound) 
     { 
      ListItem li = new ListItem(text, value); 
      ddl.Items.Add(li); 
      ddl.SelectedValue = value; 
     } 
     else 
     { 
      // didn't find it and didn't add it 
      selected = false; 
     } 
    } 
    return selected; 
}