2012-03-03 2 views
2

Приложение, над которым я работаю, - это приложение Service Desk. У меня есть форма, в которой используется DropDownList, который содержит имена сотрудников, поступающие из Active Directory. Любой сотрудник может сделать запрос и сохранить его.DropDownList выдает сообщение об ошибке, когда ListItem больше не присутствует

Проблема возникает, когда сотрудник покидает компанию и, следовательно, его учетная запись удаляется из Active Directory. Когда какой-либо другой сотрудник ищет БД для поиска соответствующего служебного билета, который может быть использован, при попытке открыть его возникает ошибка, указывающая, что имя не существует в элементах DropDownList.

Что мне нужно, так это то, что функциональность останется прежней (удастся удалить запись Active Directory), но никакая ошибка не будет выбрана.

Я использую как указано тегами ASP.NET с VB. Решения с C# также приветствуются.

Благодарим вас за ваши предложения по моей проблеме.

UPDATE:

Я добавляю код так, что он может быть более ясным.

ASPX: (Это огромное, я ставлю только DropDownList в вопросе)

<asp:FormView ID="FormView1" runat="server" DataSourceID="SqlDataSource1" 
     DataKeyNames="ITRequestId"> 
     <EditItemTemplate> 
      <br /> 
      <asp:LinkButton ID="LinkButton5" runat="server" CausesValidation="True" 
       CommandName="Update" Text="Update" CssClass="InsertLink" /> 
      &nbsp;&nbsp;&nbsp;<asp:LinkButton ID="LinkButton6" runat="server" 
       CausesValidation="False" CommandName="Cancel" Text="Cancel" CssClass="CancelLink" /> 

        ........  

        <div id="user" style="float: left;"> 
         <label>User:<asp:RequiredFieldValidator ID="RequiredFieldValidator9" runat="server" ErrorMessage="User" Display="Dynamic" ControlToValidate="DropDownList5" Text="*" ForeColor="#FF0000"></asp:RequiredFieldValidator></label><br /> 
         <asp:DropDownList ID="DropDownList5" runat="server" SelectedValue='<%# Bind("ITRequestUserName") %>'> 
          <asp:ListItem Value=""></asp:ListItem> 
          <asp:ListItem Value="All">All</asp:ListItem> 
          <asp:ListItem Value="NA">N/A</asp:ListItem> 
         </asp:DropDownList> 
        </div> 

        ......... 
     </EditItemTemplate> 

КОДА ЗА VB: (Это огромное, но я ставлю событие Pageload где брошено ошибка)

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If (Not IsPostBack) Then 
     If Request.UrlReferrer IsNot Nothing Then 
      ViewState("RefUrl") = Request.UrlReferrer.ToString() 
     End If 
    End If 
    'Handles the mode of the FormView according to the request 
    If Request.QueryString.Get("ITRequestId") IsNot Nothing Then 
     FormView1.DefaultMode = FormViewMode.ReadOnly 
     Dim tName As String = DirectCast(FormView1.Row.FindControl("DropDownList5"), DropDownList).SelectedValue 
     Dim temptype As String = DirectCast(FormView1.Row.FindControl("DropDownList1"), DropDownList).SelectedItem.Text 
     Dim myAD As New tActiveDirectory(LDAPpath) 
     Dim lName As String = HttpContext.Current.User.Identity.Name.ToString() 
     Dim sDisplayName As String = myAD.GetUserInfo(lName, "displayName") 
     Dim cName As String = DirectCast(FormView1.Row.FindControl("Label5"), Label).Text 
     If Not (User.IsInRole("Developers") Or User.IsInRole("Administrators") Or tName = sDisplayName Or cName = sDisplayName) Then 
      If (temptype = "Access rights") Then 
       Response.Redirect("../IT/ITAccessDenied.aspx") 
      End If 
     End If 
     If Not (User.IsInRole("Developers") Or User.IsInRole("Administrators") Or cName = sDisplayName) Then 
      If (temptype = "Account") Then 
       Response.Redirect("../IT/ITAccessDenied.aspx") 
      End If 
     End If 
     If Not (User.IsInRole("LocalIT")) Then 
      If (temptype = "Internal IT Task") Then 
       Response.Redirect("../IT/ITAccessDenied.aspx") 
      End If 
     End If 
    Else 
     FormView1.DefaultMode = FormViewMode.Insert 
     Dim tempstatus As DropDownList = DirectCast(FormView1.Row.FindControl("DropDownList2"), DropDownList) 
     tempstatus.SelectedIndex = 3 
    End If 
End Sub 

Ошибка, указанная в строке 11 кода при объявлении переменной tName. И это происходит потому, что UserName, которое находится в базе данных и должно быть ограничено DropDownList, было удалено из ActiveDirectory и, следовательно, оно не существует в значениях List.

Вот код, который заполнит DropDownList:

Protected Sub FormView1_ItemCreated(ByVal sender As Object, ByVal e As System.EventArgs) Handles FormView1.ItemCreated 
    Dim d1 As DropDownList 
    Dim d2 As DropDownList 
    Dim myAD As New tActiveDirectory(LDAPpath) 
    Dim users As New ArrayList() 
    users = myAD.GetAllUsersInfo() 
    d1 = DirectCast(FormView1.Row.FindControl("DropDownList5"), DropDownList) 
    d2 = DirectCast(FormView1.Row.FindControl("DropDownList7"), DropDownList) 
    d1.DataSource = users 
    d2.DataSource = users 
End Sub 

Public Function GetAllUsersInfo() As ArrayList 
     Dim Users As New ArrayList() 
     Dim myDirectory As New DirectoryEntry(sPath) 
     Dim mySearcher As New DirectorySearcher(myDirectory) 
     Dim fullName As String 
     mySearcher.Filter = "(&(objectCategory=person)(objectClass=user))" 
     mySearcher.PropertiesToLoad.Add("sn") 
     mySearcher.PropertiesToLoad.Add("displayName") 
     mySearcher.Sort.PropertyName = "sn" 
     mySearcher.Sort.Direction = SortDirection.Ascending 
     Users.Add("") 
     Users.Add("N/A") 
     Users.Add("All") 
     For Each result As DirectoryServices.SearchResult In mySearcher.FindAll 
      fullName = result.Properties("displayName")(0).ToString 
      Users.Add(fullName) 
     Next 
     Return Users 
    End Function 

Любая помощь с этим будут оценены. Спасибо.

ответ

0

Ваш вопрос не содержит подробностей относительно кода. Но похоже, что ваше приложение пытается выбрать значение в DDL, которого нет (больше). Просто проверьте, прежде чем выбрать, как это:

Dim ddl As DropDownList 
Dim item As ListItem = ddl.Items.FindByValue("Kostopoulos") 
If item IsNot Nothing Then 
    ddl.SelectedIndex = ddl.Items.IndexOf(item) 
Else 
    ddl.Items.Add(New ListItem("Not available")) 
    ddl.Enabled = False 
End If 
+0

Я добавил код. Считаете ли вы, что вы можете дать некоторое представление о нем, поскольку я не мог на самом деле соответствовать коду, который вы указали выше. Заранее спасибо. –

+0

Я предлагаю переместить <% # Bind ("ITRequestUserName")%> в код за файлом (например, Page_Load или DropDownList5_Load), где вы можете проверить, что значение находится в списке, прежде чем выбирать его. – Elementenfresser

+0

Следуя вашему предложению, мне удалось решить проблему. Благодаря! –

0

сначала вы должны найти ListItem из меню списка, как

ListItem li=DropdownID.Items.FindByValue(""); 
    if (li != null) 
    DropdownID.SelectedValue = li.Value; 

более подробно см msdn

+0

Я добавил код. Считаете ли вы, что вы можете дать некоторое представление об этом, поскольку я не мог на самом деле соответствовать коду, который вы указали выше. Заранее спасибо. –

+0

(Следуя твоему предложению, мне удалось решить проблему. Спасибо!) - Извините, что нехорошее место, чтобы добавить свой комментарий.Я хотел прокомментировать Elementenfresser –

Смежные вопросы