Share via


Sicherstellen, dass benutzerdefinierte Elementeigenschaften in Abfragen auf Ordnerebene unterstützt werden

In diesem Beispiel wird gezeigt, wie Sie sicherstellen, dass beim Hinzufügen einer benutzerdefinierten Eigenschaft zu einem Elementtyp die Eigenschaft auch dem Ordner hinzugefügt wird, sodass Sie auf Ordnerebene eine Abfrage nach dieser benutzerdefinierten Eigenschaft ausführen können.

Beispiel

In diesem Codebeispiel wird veranschaulicht, wie Sie mithilfe des UserDefinedProperties -Objekts und des UserDefinedProperty -Objekts sicherstellen können, dass eine Eigenschaft, die Sie einer benutzerdefinierten Eigenschaft hinzufügen, auch gleichzeitig dem Ordner hinzugefügt wird, sodass Sie auf der Ordnerebene eine Abfrage nach dieser benutzerdefinierten Eigenschaft ausführen können.

Wenn Sie die Add-Methode in der UserProperties-Auflistung verwenden, um eine benutzerdefinierte Eigenschaft zu einem Element hinzuzufügen, können Sie den AddToFolderFields-Parameter auf true festlegen, damit die Eigenschaft zu dem Ordner hinzugefügt wird. Die benutzerdefinierte Eigenschaft wird jedoch möglicherweise aufgrund eines Entwicklerfehlers oder einer Benutzeraktion nicht zum gewünschten Ordner hinzugefügt (wenn z. B. die benutzerdefinierte Eigenschaft über die Outlook-Feldauswahl entfernt oder das Element in einen anderen Ordner verschoben wird). Aus diesem Grund tritt bei der Find-Methode und bei der Restrict-Methode des Items-Objekts, das diese benutzerdefinierte Eigenschaft verwendet, ein Fehler auf. Mithilfe des UserDefinedProperties-Objekts können Sie testen, ob Ihre benutzerdefinierten Eigenschaften in dem Ordner vorhanden sind und die benutzerdefinierten Eigenschaften hinzufügen, wenn sie nicht vorhanden sind oder entfernt wurden.

Zum Beibehalten einer durch ein UserDefinedProperty-Objekt dargestellten benutzerdefinierten Eigenschaft in einem Ordner müssen Sie die benutzerdefinierte Eigenschaft unter dem gleichen Namen im betreffenden Element speichern. Es hat keinerlei Wirkung, wenn Sie einen Wert im UserDefinedProperty-Objekt für den Ordner speichern. Sie müssen die UserProperties-Auflistung des Elements so definieren, dass sie auf das festzulegende UserProperty -Objekt zugreift, und dann den Wert für das UserProperty-Objekt festlegen. Achten Sie darauf, dass Sie die Save-Methode für das Element aufrufen, damit die Änderungen beibehalten werden.

Wenn Sie Visual Studio verwenden, um dieses Codebeispiel zu testen, müssen Sie der Microsoft Outlook 15.0-Objektbibliothekkomponente zuerst einen Verweis hinzufügen und die Outlook-Variable angeben, wenn Sie den Microsoft.Office.Interop.Outlook-Namespace importieren. Die Anweisung Imports oder using darf im Codebeispiel nicht direkt vor den Funktionen stehen, sondern muss vor der öffentlichen Class-Deklaration hinzugefügt werden. Die folgenden Codezeilen zeigen, wie Sie den Import und die Zuweisung in Visual Basic und C# vornehmen.

Imports Outlook = Microsoft.Office.Interop.Outlook
using Outlook = Microsoft.Office.Interop.Outlook;
Private Sub DemoUserDefinedProperty()
    Dim folder As Outlook.Folder = _
        CType(Application.ActiveExplorer().CurrentFolder(), _
        Outlook.Folder)
    Dim post As Outlook.PostItem = CType( _
        folder.Items.Add("IPM.Post"), Outlook.PostItem)
    ' Add UserProperty to PostItem
    post.UserProperties.Add("ColorID", _
        Outlook.OlUserPropertyType.olText, False)
    post.UserProperties("ColorID").Value = "Green"
    post.Subject = "UserProperty Example"
    post.Save()
    Dim findPost As Outlook.PostItem
    Try
        ' Items.Find will fail unless custom property
        ' is defined in the folder
        findPost = _
            CType(folder.Items.Find("[ColorID] = 'Green'"), _
            Outlook.PostItem)
        Catch ex As Exception
            Debug.WriteLine(ex.Message)
        End Try
        ' Add ColorID field to the folder
        folder.UserDefinedProperties.Add("ColorID", _
            Outlook.OlUserPropertyType.olText)
        ' Now the find works ok
        Dim findPostOK As Outlook.PostItem
        Try
            findPostOK = _
                CType(folder.Items.Find("[ColorID] = 'Green'"), _
                Outlook.PostItem)
            If Not (findPostOK Is Nothing) Then
                Debug.WriteLine("Found PostItem")
            End If
            ' Cleanup by deleting PostItem and ColorID
            findPostOK.Delete()
            Dim userProperty As Outlook.UserDefinedProperty = _
                folder.UserDefinedProperties("ColorID")
            userProperty.Delete()
        Catch ex As Exception
            Debug.WriteLine(ex.Message)
        End Try
End Sub
private void DemoUserDefinedProperty()
{
    Outlook.Folder folder =
        Application.ActiveExplorer().CurrentFolder
        as Outlook.Folder;
    Outlook.PostItem post = folder.Items.Add("IPM.Post")
        as Outlook.PostItem;
    // Add UserProperty to PostItem
    post.UserProperties.Add("ColorID",
        Outlook.OlUserPropertyType.olText,
        false, Type.Missing);
    post.UserProperties["ColorID"].Value = "Green";
    post.Subject = "UserProperty Example";
    post.Save();
    Outlook.PostItem findPost;
    try
    {
        // Items.Find will fail unless custom property
        // is defined in the folder
        findPost =
            folder.Items.Find("[ColorID] = 'Green'")
            as Outlook.PostItem;
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
    }
     // Add ColorID field to the folder
    folder.UserDefinedProperties.Add("ColorID",
        Outlook.OlUserPropertyType.olText,
        Type.Missing, Type.Missing);
    // Now the find works ok
    Outlook.PostItem findPostOK;
    try
    {
        findPostOK =
            folder.Items.Find("[ColorID] = 'Green'")
            as Outlook.PostItem;
        if (findPostOK != null)
        {
            Debug.WriteLine("Found PostItem");
        }
        // Cleanup by deleting PostItem and ColorID
        findPostOK.Delete();
        Outlook.UserDefinedProperty userProperty =
            folder.UserDefinedProperties["ColorID"];
        userProperty.Delete();
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
    }
}

Siehe auch