locked
Addin outlook 2007 et NullReferenceException en VB RRS feed

  • Question

  •  

    Bonjour à tous,

     

    Je bute sur System.NullReferenceException.

     

    Nous avons dans notre calendrier des RdV privés et des RdV liés à des projets.

    Lors de l'enregistrement du RdV lié à un projet, je stocke l'identifiant du projet dans un champ personnalisé (textPorjID).

    Lorsque je slectionne l'item je récupére les infos pour pouvoir gérer le copier coller (par exemple) et l'enregistrement dans une base SQL 2005.

    Si le champ personnalisé existe je n'ai acun pb, par contre s'il n'existe pas j'ai un NullReferenceException.

    Comment faire pour que tout marche.

     

    Voilà mon code :

     

    Dim selectedFolder As Outlook.MAPIFolder = Me.Application.ActiveExplorer().CurrentFolder

    Dim expMessage As String

    Dim itemMessage As String = ""

    currentExplorer = Me.Application.Explorers.Application.ActiveExplorer

    Try

    If Me.Application.ActiveExplorer.Selection.Count > 0 Then

    Dim selObject As Object = Me.Application.ActiveExplorer.Selection.Item(1)

    If (TypeOf selObject Is Outlook.AppointmentItem) Then

    expMessage = "Your current folder is " & selectedFolder.Name & "." & vbCrLf

    ai = TryCast(selObject, Outlook.AppointmentItem)

    Dim FintestProjID As Outlook.UserProperty = ai.UserProperties.Find("textProjID")

    FinProjIDVar = FintestProjID.Value.ToString

    ItemSubject = ai.Subject

    ItemStart = ai.Start

    ItemEntryID = ai.EntryID

    ItemEnd = ai.End

    MsgBox(ItemEntryID & " " & ItemSubject & " " & FinProjIDVar)

    End If

    End If

    Catch ex As Exception

    expMessage = ex.Message

    End Try

     

    par avance merci.
    lundi 13 octobre 2008 10:54

Réponses

  • Bonjour,

     

    Supprimer d'abord les mots Try/Catch et laissez l'application (et en particulier Visual Studio) vous afficher l'emplacement qui pose problème...

     

    Cordialement

    lundi 13 octobre 2008 20:12
  • Bonjour,

     

    Avez vous essayer de parcourir la collection UserProperties item par item ?

     

    Code Snippet

    Private Function Rechercher(up As UserProperties, name As String) As UserProperty

     

    For i = 0 To up.Count

    If up(i).Name = name Then

    Return up

    End If

    Next i

     

    Return Nothing

     

    End

     

     

    Et vous l'appelez ainsi :

    Code Snippet

    Property p = Rechercher(ai.UserProperties, "textProjID")

    If p Is Not Nothing Then

    ....

    End If

     

     

    Cordialement

    mardi 14 octobre 2008 20:19

Toutes les réponses

  • Bonjour,

     

    Supprimer d'abord les mots Try/Catch et laissez l'application (et en particulier Visual Studio) vous afficher l'emplacement qui pose problème...

     

    Cordialement

    lundi 13 octobre 2008 20:12
  •  

    Bonjour,

     

    J'ai suivi votre conseil en supprimant les mots Try/catch.

    Le blocage est au niveau :

     

    Dim FintestProjID As Outlook.UserProperty = ai.UserProperties.Find( "textProjID" )

    En fait je veux tester si le champ personnalisé textProjID existe sur le  RdV en cours avant de le coller dans le calendrier.

    Si il existe je déclenche un insert dans une base SQL, si il n'existe pas on colle le RdV sans enregistrement SQL.

     

    Ors, si le champ textProjID n'existe pas il me génère une exception du type NullReferenceException.

    De plus si je copie un RdV ou le champ textProjID existe il me génère deux enregistrement SQL 1 pour l'exception et 1 pour le rdv en cours (à chaque fois c'est n+1).

     

    Existe-t-il un méthode pour tester l'existence d'un champ sans génèrer une erreur.

    Je patauge complétement.

     

    merci par avance.

    cordialement

    mardi 14 octobre 2008 14:12
  • Bonjour,

     

    Avez vous essayer de parcourir la collection UserProperties item par item ?

     

    Code Snippet

    Private Function Rechercher(up As UserProperties, name As String) As UserProperty

     

    For i = 0 To up.Count

    If up(i).Name = name Then

    Return up

    End If

    Next i

     

    Return Nothing

     

    End

     

     

    Et vous l'appelez ainsi :

    Code Snippet

    Property p = Rechercher(ai.UserProperties, "textProjID")

    If p Is Not Nothing Then

    ....

    End If

     

     

    Cordialement

    mardi 14 octobre 2008 20:19
  •  

    Bonjour,

     

    Merci pour votre réponse, mais j’avoue mon incompétence.

     

    Comment  appeler la fonction recherche (Property p).

    Pourquoi parcourir la collection UserProperties Item par Item quand seul l’Item sélectionner (pour un copier coller) m’intéresse ?

     

    Voilà l'ensemble de mon code.

     

    Private WithEvents ai As Outlook.AppointmentItem

    Public WithEvents Item As Outlook.Items

    Public WithEvents myOlapp As Outlook.Application

    Public WithEvents myOlExp As Outlook.Explorer

     

    Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup

    Dim OlMapi As Outlook.NameSpace

    Dim OlFolder As Outlook.MAPIFolder

    Dim OlApp As New Outlook.Application

    OlMapi = OlApp.GetNamespace("MAPI")

    OlFolder = OlMapi.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar)

    For Each o As Object In OlFolder.Items

    If TypeOf o Is Outlook.AppointmentItem Then

    ai = o

    Else

    Exit For

    End If

    Next

    If ai Is Nothing Then

    Else

    AddHandler ai.BeforeDelete, AddressOf ai_BeforeDelete

    End If

    Item = OlFolder.Items

    currentExplorer = Me.Application.Explorers.Application.ActiveExplorer

    AddHandler currentExplorer.SelectionChange, AddressOf currentExplorer_Event

    End Sub

     

    Public Sub Initialize_Handlers()

    AddHandler Item.ItemAdd, AddressOf Item_ItemAdd

    End Sub

     

    Public Sub currentExplorer_Event()

    Dim selectedFolder As Outlook.MAPIFolder = Me.Application.ActiveExplorer().CurrentFolder

    Dim expMessage As String

    Dim itemMessage As String = ""

    currentExplorer = Me.Application.Explorers.Application.ActiveExplorer

    Try

    If Me.Application.ActiveExplorer.Selection.Count > 0 Then

    Dim selObject As Object = Me.Application.ActiveExplorer.Selection.Item(1)

    If (TypeOf selObject Is Outlook.AppointmentItem) Then

    expMessage = "Your current folder is " & selectedFolder.Name & "." & vbCrLf

    ai = TryCast(selObject, Outlook.AppointmentItem)

    ItemSubject = ai.Subject

    ItemStart = ai.Start

    ItemEntryID = ai.EntryID

    ItemEnd = ai.End

    End If

    End If

    Catch ex As Exception

    expMessage = ex.Message

    End Try

    End Sub

     

    Fin 1ere partie

    cordialement

    mercredi 15 octobre 2008 15:15
  • 2nd Partie

     

    Private Sub currentExplorer_BeforeItemPaste(ByRef ClipboardContent As Object, ByVal Target As Microsoft.Office.Interop.Outlook.MAPIFolder, ByRef Cancel As Boolean) Handles currentExplorer.BeforeItemPaste

    Initialize_Handlers()

    End Sub

     

    Private Sub Item_ItemAdd(ByVal Item As Object)

    Dim dateItem As DateTime

    dateItem = Item.Start

    Weeknumber_Entire4DayWeekRule(dateItem)

    Dim CetteDate As Date

    Dim CetteAnn‚e As Integer

    CetteDate = dateItem

    CetteAnn‚e = Year(CetteDate)

    Dim NumSem As Byte = CalcNumSem

    Semaine = "Sem " & CalcNumSem & " du " & Format(PremierJourSemaine(NumSem, CetteAnn‚e), "d MMMM yyyy")

     

    Try

    Dim FintestProjID As Outlook.UserProperty = ai.UserProperties.Find("textProjID")

    FinProjIDVar = FintestProjID.Value.ToString

    Dim FinTestEmpID As Outlook.UserProperty = ai.UserProperties.Find("textEmpID")

    FinEmpIDVar = FinTestEmpID.Value.ToString

     

     

    If Not FintestProjID Is Nothing Then

    MsgBox(ItemEntryID & " " & FinEmpIDVar & " " & FinProjIDVar)

    HeureDeb = Format(Item.Start, "h:mm")

    HeureFin = Format(Item.End, "h:mm")

    Dim MyConnString As String = My.Settings.AGURConnectionString

     

    Dim FdCls As New MyDataClass.Activit‚_Essai.spI(MyConnString)

     

    FdCls.Values.Acti_EntryID.Value = Item.EntryID

    FdCls.Values.ActiEmploy‚s_ID.Value = FinEmpIDVar

    FdCls.Values.Acti_ProjetID.Value = FinProjIDVar

    FdCls.Values.Sujet.Value = Item.Subject

    FdCls.Values.Categorie.Value = Item.Categories

    FdCls.Values.DateStart.Value = Item.Start

    FdCls.Values.HeureDebut.Value = HeureDeb

    FdCls.Values.DateEnd.Value = Item.End

    FdCls.Values.HeureFin.Value = HeureFin

    FdCls.Values.Dur‚e.Value = Item.Duration

    FdCls.Values.Semaine.Value = Semaine

    FdCls.Execute()

    FdCls.Disconnect()

    End If

    Catch ex As NullReferenceException

    MsgBox("coucou")

    FinProjIDVar = Nothing

    FinEmpIDVar = Nothing

    ItemSubject = Nothing

    ItemStart = Nothing

    ItemEntryID = Nothing

    ItemEnd = Nothing

    MsgBox(ItemEntryID & " " & ItemSubject & " " & FinProjIDVar)

    Remove_Handler()

    Thread.CurrentThread.Abort()

    Exit Sub

    End Try

    Remove_Handler()

    End Sub

     

    Private Sub Remove_Handler()

    RemoveHandler Item.ItemAdd, AddressOf Item_ItemAdd

    End Sub

     

    Private Sub Item_ItemChange(ByVal Item As Object) Handles Item.ItemChange

    Dim dateItem As DateTime

    dateItem = Item.Start

    Weeknumber_Entire4DayWeekRule(dateItem)

    Dim CetteDate As Date

    Dim CetteAnn‚e As Integer

    CetteDate = dateItem

    CetteAnn‚e = Year(CetteDate)

    Dim NumSem As Byte = CalcNumSem

    Semaine = "Sem " & CalcNumSem & " du " & Format(PremierJourSemaine(NumSem, CetteAnn‚e), "d MMMM yyyy")

    ItemEntryID = Item.EntryID

     

    Dim MyConnString As String = My.Settings.AGURConnectionString

    Dim FdCls As New MyDataClass.Activit‚_Essai.spU(MyConnString)

    FdCls.Filters.Acti_EntryID.Value = ItemEntryID

    FdCls.Values.DateStart.Value = Item.Start

    FdCls.Values.DateEnd.Value = Item.End

    FdCls.Values.Dur‚e.Value = Item.Duration

    HeureDeb = Format(Item.Start, "h:mm")

    HeureFin = Format(Item.End, "h:mm")

    FdCls.Values.HeureDebut.Value = HeureDeb

    FdCls.Values.HeureFin.Value = HeureFin

    FdCls.Values.Semaine.Value = Semaine

    FdCls.Execute()

    FdCls.Disconnect()

    End Sub

     

    Private Sub ai_BeforeDelete(ByVal Item As Object, ByRef cancel As Boolean)

    cancel = False

    End Sub

     

    Private Sub Item_ItemRemove() Handles Item.ItemRemove

    Dim msg As String

    Dim title As String

    Dim style As MsgBoxStyle

    Dim response As MsgBoxResult

    msg = ("Vous allez supprimer ce rendez-vous : " & ItemSubject)

    style = MsgBoxStyle.DefaultButton1 Or _

    MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly

    title = "Suppression"

    response = MsgBox(msg, style, title)

    If response = MsgBoxResult.Ok Then

    DeleteSQL()

    ai_BeforeDelete(Item, cancel:=True)

    End If

    End Sub

     

    Private Sub DeleteSQL()

    ' string de connexion.

    Dim MyConnString As String = My.Settings.AGURConnectionString

    ' Initialisation(d) 'une nouvelle instance de notre classe de suppression "Activit‚"

    Dim FdCls As New MyDataClass.Activit‚_Essai.spD(MyConnString)

    ' On choisi un notre ligne d'activit‚

    FdCls.Filters.Acti_EntryID.Value = ItemEntryID

    ' On ex‚cute le tout...suppresion

    FdCls.Execute()

    'On ferme la connexion

    FdCls.Disconnect()

    End Sub

     

    Merci pour votre aide

    cordialement

    mercredi 15 octobre 2008 15:22
  • Bonjour,

     

    J'ai du mal à comprendre à votre problème...

    La méthode Find() déclenche une exception si la userproperty que vous recherchez n'existe pas.

    Je vous propose alors une solution qui recherche userproperty par userproperty, une userproperty disposant d'un nom spécifique.

     

    Voici comme utiliser cette fonction :

     

    Code Snippet

    Dim FintestProjID As Outlook.UserProperty = Rechercher(ai.UserProperties, "textProjID")

    If FintestProjID Is Nothing Then

    'Oups, n'existe pas !

    Else

    'Ok, ca existe

    End If

     

     

    Lorsque vous copier/coller du code, pensez aux autres en indentant votre code afin qu'il soit le plus lisible !

     

    Cordialement

     

    mercredi 15 octobre 2008 20:26
  • Bonjour,

     

     

    Je teste votre solution et le retour est :

    Une exception de première chance de type 'System.Runtime.InteropServices.COMException' s'est produite dans Activité.DLL.

    Je ne comprend pas pourquoi.

     

    Merci pour votre réponse.

     

    Cordialement

    jeudi 16 octobre 2008 10:43
  • Bonjour,

     

    Supprimer définitivement (c'est à dire ne les remettez plus...) tous vos bloc Try / Catch et indiquez nous en détail le message d'erreur de l'exception.

     

    Cordialement

     

    jeudi 16 octobre 2008 18:28
  • Bonjour,

     

    L'exception est produite dans la fonction rechercher :

    Private Function Rechercher(ByVal up As Outlook.UserProperties, ByVal name As String) As Outlook.UserProperty

    For i = 0 To up.Count

    If up(i).Name = name Then  (ligne 117)

    Return up

    End If

    Next i

    Return Nothing

    End Function

     

     

    L'exception System.Runtime.InteropServices.COMException s'est produite
      ErrorCode=-2147352567
      Message="Index de la matrice en dehors des limites."
      Source="Microsoft Office Outlook"
      StackTrace:
           à Microsoft.Office.Interop.Outlook.UserProperties.get_Item(Object Index)    à OutlookActivité.ThisAddIn.Rechercher(UserProperties up, String name) dans E:\Documents and Settings\a.caneparo\Mes documents\Visual Studio 2008\Projects\Activite\OutlookActivité\OutlookActivité\ThisAddIn.vb:ligne 117
      InnerException:

    cordialement

    vendredi 17 octobre 2008 07:22
  • Bonjour,

     

    Voilà qui est plus clair !

    Autant pour moi, il faut commencer la boucle à partir de "1".

     

    Cordialement

     

    vendredi 17 octobre 2008 09:26
  • Bonjour,

     

    Bon je teste en commençant à partir de 1.

     

    Pour le champ personnalisé qui n'existe pas tout est ok.

    Mais si le champ personnalisé existe, on a une InvalidCastException sur le Return up

     

    For i = 1 To up.Count

    If up(i).Name = name Then

    Return up

    End If

    Next i

    Return Nothing

     

     

    L'exception System.InvalidCastException s'est produite
      Message="Impossible d'effectuer un cast d'un objet COM de type 'System.__ComObject' en type d'interface 'Microsoft.Office.Interop.Outlook.UserProperty'. Cette opération a échoué, car l'appel QueryInterface sur le composant COM pour l'interface avec l'IID '{00063042-0000-0000-C000-000000000046}' a échoué en raison de l'erreur suivante : Cette interface n'est pas prise en charge (Exception de HRESULT : 0x80004002 (E_NOINTERFACE))."
      Source="Activité"
      StackTrace:
           à OutlookActivité.ThisAddIn.Rechercher(UserProperties up, String name) dans E:\Documents and Settings\a.caneparo\Mes documents\Visual Studio 2008\Projects\Activite\OutlookActivité\OutlookActivité\ThisAddIn.vb:ligne 118
      InnerException:

    Cordialement

    vendredi 17 octobre 2008 10:14
  • Bonjour,

     

    Aprés une courte interruption, j'essaye de m'en sortir avec l'InvalidCastException , malheuresement je n'arrive à rien.

     

    Si l'un d'entre vous a une idée ... !!!

     

    merci par avance

    Cordialement

    jeudi 30 octobre 2008 14:07