Outlook Ribbon - Bei Klick auf Button ...

  • VB.NET

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von MK_CGN.

    Outlook Ribbon - Bei Klick auf Button ...

    Hallo zusammen,
    eine Überschrift für meine Frage zu finden ist mir nicht leicht gefallen. Ich versuche es dennoch mal zu erklären.
    Ich habe ein Outlook 2010 Ribbon erstellt. Darin enthalten sind mehrere Buttons. Per Klick auf die Buttons wird eine Form geöffnet und man führt eine DB-Abfrage durch.
    Diese erhaltenen Daten sende ich per Button_Klick an eine .oft Outlook Vorlage. An diversen Textmarken wird dann die Textmarke durch Inhalte von Textboxen aus der Form ersetzt.

    Funktioniert auch soweit hervorragend. Bis dato hatte ich allerdings für jeden Fall einen eigenen Button im Ribbon und dahinter eine eigene Form für die jeweilige Vorlage. Da es mittlerweile aber ca. 20 Stück sind habe ich mir gedacht es wäre möglich
    eine Form zu verwenden und dann je nach Ribbon_Button_Klick Ereignis die entsprechende oft Vorlage zu öffnen.

    Wie kann ich aus der Form denn auf das Ribbon_Button_Klick Ereignis?

    Ich hoffe, ich konnte mich verständlich ausdrücken.

    Viele Grüße und danke vorab!
    Hat jemand eine Idee wie ich mein Problem lösen kann?

    Bei einer Form geht dies ja folgendermaßen:

    Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Form2.TextBox1.Text = Me.TextBox1.Text
    4. Form2.Show()
    5. End Sub
    6. End Class


    Aber wie lässt sich sowas mit einem Button in einem Ribbon bewerkstelligen?

    Ich möchte folgendes erreichen. User klickt auf einen der vielen Button in der Ribbon Bar. Damit öffnet sich ein Form, für die Datenbankabfrage. Nach erfolgter Suche und Klick auf den Button "Vorlage öffnen" soll dann die E-Mail Vorlage geöffnet werden, die für den Button zuständig ist. Beispiel: User klickt auf den Button "A". Dann öffnet sich die Form_Datenbankabfrage. Nach Klick auf den Button "Vorlage öffnen", soll dann die E-Mail Vorlage "Button A.oft" geöffnet werden.

    Vielen Dank vorab für Eure Hilfestellungen.

    MK_CGN schrieb:

    Bei einer Form geht dies ja folgendermaßen:
    Eben nicht!
    Du musst mit Instanzen arbeiten!
    Verstehe den Inhalt dieses Threads: Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo zusammen,
    ich habe mir den Link angeschaut und die Umsetzung auf meine Bedürfnisse angefangen zu programmieren.
    In der Form habe ich folgenden Code hinzugefügt

    Quellcode

    1. ...
    2. Dim Pfad_Vorlage As String
    3. Dim Test_RibbonDlg As Test_Ribbon = New Test_Ribbon()
    4. If Test_RibbonDlg.btn_Test_1.Enabled = True Then
    5. Pfad_Vorlage = My.Settings.TextBox_Vorlage_A
    6. ElseIf Test_RibbonDlg.btn_Test_2.Enabled = True Then
    7. Pfad_Vorlage = My.Settings.TextBox_Vorlage_B
    8. End If
    9. moft = CreateObject("Outlook.Application")
    10. Try
    11. For Each row As DataGridViewRow In DGV_Datenbankabfrage.Rows
    12. Dim isSelected As Boolean = Convert.ToBoolean(row.Cells("checkBoxColumn").Value)
    13. If isSelected Then
    14. mMail = moft.CreateItemFromTemplate(Pfad_Vorlage)
    15. mMail.Display()
    16. ...


    Er öffnet dann aber egal, welchen der beiden Test-Buttons ich klicke immer die Vorlage_A.
    Eine Fehlermeldung erhalte ich nicht.

    MK_CGN schrieb:

    immer die Vorlage_A
    Dann scheint Test_RibbonDlg.btn_Test_1.Enabled immer enabled zu sein.
    Setz einen Haltepunkt da drauf und sieh Dir den Inhalt der Variablen und Properties an: Debuggen, Fehler finden und beseitigen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo @MK_CGN

    Ich würde den Pfad zu der oft-Vorlagen bei Klick auf den Button in eine globale Variable schreiben.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Pfad_Vorlage As String
    3. Private Sub Button_Click(sender As System.Object, e As System.EventArgs) Handles btn_Test_1.Click, btn_Test_2.Click
    4. Select Case CType(sender, Button).Name
    5. Case btn_Test_1.Name
    6. Pfad_Vorlage = My.Settings.TextBox_Vorlage_A
    7. Case btn_Test_2.Name
    8. Pfad_Vorlage = My.Settings.TextBox_Vorlage_B
    9. Case Else
    10. MessageBox.Show("Keine Vorlage vorhanden")
    11. Exit Sub
    12. End Select
    13. FillOutlookTemplate()
    14. End Sub
    15. Sub FillOutlookTemplate()
    16. ' hier Code ergänzen
    17. End Sub
    18. End Class
    Moin und ein frohes neues Jahr.

    Sorry, dass ich mich erst jetzt melde, hatte aber vorher keine Gelegenheit dazu.
    @HenryV: Ich habe Deinen Vorschlag umgesetzt. Allerdingsk ommt es zuf FEhlermeldung, dass die Handles-Klausel eine WithEvents-Variable fordert.
    Diese Meldung erhalte ich in der Zeile

    Quellcode

    1. Private Sub Btn_Vorlage_Click(sender As System.Object, e As System.EventArgs) Handles btn_Test_1.Click, btn_Test_2.Click


    Muss ich die Buttons noch per DIM zuweisen?
    Okay danke, habe das im Publicbereich des forms deklariert. Fehlermeldung ist nun weg.
    Allerdings wird die oft. Vorlage nicht bei Klick auf den Button "Btn_Vorlage_Click" geöffnet. Es passiert gar nichts.

    Ein Debugging mit Haltepunkt habe ich versucht, aber ich habe nicht die Möglichkeit gehabt, das Debugging im Einzelschritt mit F11 fortzuführen nach dem Haltepunkt :(

    Ich arbeite mit einem Timer, könnte das eventuell das Problem verursachen?

    Quellcode

    1. Public Class frm_Datenbankabfrage
    2. Public Pfad_Vorlage As String
    3. Friend WithEvents btn_Test_1 As Button
    4. Friend WithEvents btn_Test_2 As Button


    Quellcode

    1. Private Sub Btn_Vorlage_Click(sender As System.Object, e As System.EventArgs) Handles btn_Test_1.Click, btn_Test_2.Click
    2. Select Case CType(sender, Button).Name
    3. Case btn_Test_1.Name
    4. Pfad_Vorlage = My.Settings.TextBox_Vorlage_A
    5. Case btn_Test_2.Name
    6. Pfad_Vorlage = My.Settings.TextBox_Vorlage_B
    7. Case Else
    8. MessageBox.Show("Keine Vorlage vorhanden")
    9. Exit Sub
    10. End Select
    11. Timer1.Start()
    12. Close()
    13. End Sub


    Quellcode

    1. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    2. Timer1.Stop()
    3. Dim ThisOutlookSession As Outlook.Application = New Outlook.Application
    4. Dim NS As Outlook.NameSpace = ThisOutlookSession.Session
    5. Dim myOlApp As Outlook.Application
    6. Dim myOlExp As Outlook.Explorer
    7. Dim myOlSel As Outlook.Selection
    8. Dim Kennung As String
    9. Dim moft As Outlook.Application
    10. Dim mMail As Outlook.MailItem
    11. Dim strbody As String
    12. Dim objItem As Object
    13. Dim Anrede As String
    14. moft = CreateObject("Outlook.Application")
    15. Try
    16. For Each row As DataGridViewRow In DGV_Datenbankabfrage.Rows
    17. Dim isSelected As Boolean = Convert.ToBoolean(row.Cells("checkBoxColumn").Value)
    18. If isSelected Then
    19. mMail = moft.CreateItemFromTemplate(Pfad_Vorlage)
    20. ...


    Momentan weiß ich mir leider keinen Rat mehr...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MK_CGN“ ()

    mir scheint, du hast ein problem, OOP zu verstehen.
    Bei einem Event muss die Empfänger-Methode beim Sender registriert werden, beim Sender - nicht irgendwo anders.
    Also irgendwo einen Button zu deklarieren bedeutet nicht zwingend, dass dieser Button auch derjenige ist, auf den du im Ribbon draufklicken kannst.

    Aber du hattest doch schoma einen Code, wo die Klickse überhaupt ankamen.
    Nach diesem Code habich dich in Post#4 gefragt, letztes Jahr.
    Aber du hast nur verlorene Zeilen hingeklatscht, und keine Methode mit Anfang und Ende.

    Also ich täte empfehlen, du entwickelst dein Projekt soweit "zurück", dass die Klicks wieder ankommen, zeigst dann die ganze Methode, wo die Klicks ankommen, und da guckt man nochma, was denn nicht richtig damit funktionierte.
    @ErfinderDesRades:
    Ich habe jetzt mal versucht, den Code zu posten, der funktioniert. Wie gesagt bis dato habe ich ca. 20 Forms erstellt mit fast identischem Quellcode, damit die unterschiedlichen Formulare angesprochen werden, je nach dem welchen Button der User in der Ribbonbar anklickt. Das ist genau dass, was ich vereinfachen würde, so dass nur noch 1 Form vorhanden sein muss.

    Sollte Quellcode fehlen, dann sag Bescheid.

    Test_Ribbon.vb:

    Quellcode

    1. Imports Microsoft.Office.Tools.Ribbon
    2. Imports Microsoft.Office.Interop.Outlook
    3. Imports System.Net
    4. Imports System.Data
    5. Imports System.Data.SqlClient
    6. Imports System
    7. Imports System.Text.RegularExpressions
    8. Imports System.Windows.Forms
    9. Public Class Test_Ribbon
    10. Private Sub Btn_Test1_Click(sender As System.Object, e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Btn_Test1.Click
    11. Dim Form_Vorlage1Dlg As Form_Vorlage1 = New Form_Vorlage1()
    12. Form_Vorlage1SDlg.ShowDialog()
    13. End Sub
    14. Private Sub Btn_Test2_Click(sender As System.Object, e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Btn_Test2.Click
    15. Dim Form_Vorlage2Dlg As Form_Vorlage2 = New Form_Vorlage2()
    16. Form_Vorlage2SDlg.ShowDialog()
    17. End Sub
    18. Private Sub Btn_Test3_Click(sender As System.Object, e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Btn_Test3.Click
    19. Dim Form_Vorlage3Dlg As Form_Vorlage3 = New Form_Vorlage3()
    20. Form_Vorlage3SDlg.ShowDialog()
    21. End Sub
    22. Private Sub Btn_Test20_Click(sender As System.Object, e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Btn_Test20.Click
    23. Dim Form_Vorlage20Dlg As Form_Vorlage20 = New Form_Vorlage20()
    24. Form_Vorlage20SDlg.ShowDialog()
    25. End Sub
    26. End class


    Hier jetzt exemplarisch der Code für eine Form:

    Quellcode

    1. Imports System.Data
    2. Imports System.Data.SqlClient
    3. Imports System.Windows.Forms
    4. Public Class frm_Test1
    5. Public Pfad_Vorlage As String
    6. Private Sub btn_DBAbfrage_Click(sender As Object, e As EventArgs) Handles btn_DBAbfrage.Click
    7. ' Quellcode nicht dargestellt, funktioniert einwandfrei dient zur Abfrage der Datenbank und füllen der Textmarken in der Email-Vorlage.
    8. End Sub
    9. Private Sub Btn_close_Click(sender As Object, e As EventArgs) Handles btn_close.Click
    10. Close()
    11. End Sub
    12. Private Sub Btn_Vorlage_Click(sender As Object, e As EventArgs) Handles btn_Vorlage.Click
    13. Timer1.Start()
    14. Close()
    15. End Sub
    16. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    17. Timer1.Stop()
    18. Dim ThisOutlookSession As Outlook.Application = New Outlook.Application
    19. Dim NS As Outlook.NameSpace = ThisOutlookSession.Session
    20. Dim myOlApp As Outlook.Application
    21. Dim myOlExp As Outlook.Explorer
    22. Dim myOlSel As Outlook.Selection
    23. Dim moft As Outlook.Application
    24. Dim mMail As Outlook.MailItem
    25. Dim strbody As String
    26. Dim objItem As Object
    27. Dim Anrede As String
    28. moft = CreateObject("Outlook.Application")
    29. Pfad_Vorlage = My.Settings.TextBox_Vorlage1
    30. Try
    31. For Each row As DataGridViewRow In DGV_Datenbankabfrage.Rows
    32. Dim isSelected As Boolean = Convert.ToBoolean(row.Cells("checkBoxColumn").Value)
    33. If isSelected Then
    34. mMail = moft.CreateItemFromTemplate(Pfad_Vorlage)
    35. mMail.Display()
    36. mMail.SentOnBehalfOfName = "xxx@xxx.xxx"
    37. objItem = ThisOutlookSession.ActiveInspector.CurrentItem()
    38. myOlApp = ThisOutlookSession.Application
    39. myOlExp = myOlApp.ActiveExplorer
    40. myOlSel = myOlExp.Selection
    41. myOlApp.GetNamespace("MAPI").Logon()
    42. ' Übergabe der E-Mail Adresse
    43. mMail.To = row.Cells(7).Value.ToString()
    44. ' Übergabe und prüfung der Anrede
    45. If row.Cells(34).Value.ToString() = "Herrn" Then
    46. Anrede = "Herr"
    47. Else Anrede = "Frau"
    48. End If
    49. ' Erstellen der Betreffzeile
    50. objItem.subject = row.Cells(148).Value.ToString() & " " & "-" & " " & objItem.Subject & row.Cells(35).Value.ToString() & ", " & row.Cells(36).Value.ToString()
    51. ' Ersetzen der Textmarken Anrede und Nachname
    52. strbody = mMail.HTMLBody
    53. strbody = Replace(strbody, "%Anrede%", Anrede)
    54. strbody = Replace(strbody, "%Nachname%", row.Cells(35).Value.ToString())
    55. 'Ersetzung von weiteren Textmarken...
    56. mMail.HTMLBody = strbody
    57. End If
    58. Next
    59. Catch ex As System.Exception
    60. MsgBox(ex.Message)
    61. End Try
    62. End Sub
    63. End Class

    So, wenn du Code lieferst, kann man auch sinnvoll VerbesserungsVorschläge machen:

    VB.NET-Quellcode

    1. Public Class Test_Ribbon
    2. Private Sub AnyButton_Click(sender As Object, e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Btn_Test1.Click, Btn_Test2.Click,Btn_Test3.Click, Btn_Test20.Click
    3. Dim frm As Form
    4. Select Case True
    5. Case sender Is Btn_Test1:frm=New Form_Vorlage1()
    6. Case sender Is Btn_Test2:frm=New Form_Vorlage2()
    7. Case sender Is Btn_Test3:frm=New Form_Vorlage3()
    8. Case sender Is Btn_Test20:frm=New Form_Vorlage20()
    9. Case Else : Throw New InvalidOperationException("unknown Ribbon-Button clicked")
    10. End Select
    11. frm.ShowDialog
    12. End Sub
    13. End Class
    Man kanns auch noch mehr zusammendrücken, indem man ein Dictionary bildet, aber das käme mir momentand etwas überkandidelt vor.
    Eher problematisch, dass du 20 Forms hast, die alle fast gleich heissen, und evtl. auch alle das gleiche tun.
    Das kann man womöglich reduzieren, und das wäre dann eine sehr deutliche Verbesserung deiner Architektur.
    Aber vlt. auch nicht.
    @ErfinderDesRades:
    Vielen Dank schon mal für Deine Zusammenfassung des Quellcodes innerhalb der "Test_Ribbon.vb". Die ist soweit auch für mich verständlich und nachvollziehbar. Werde ich morgen umsetzen.

    Eher problematisch, dass du 20 Forms hast, die alle fast gleich heissen, und evtl. auch alle das gleiche tun.Das kann man womöglich reduzieren, und das wäre dann eine sehr deutliche Verbesserung deiner Architektur.Aber vlt. auch nicht.


    Dass wäre der zweite Schritt, dass ich die Anzahl der Forms reduzieren möchte. Das ist der zweite Codeteil aus meinem Beitrag #15. Da muss ich halt nur schauen, dass je nach Klick auf Button 1 oder 2... die richtige oft-Datei geöffnet wird.

    Quellcode

    1. Case sender Is Btn_Test1:frm=New Form_Vorlage1()

    Kann man hier rein theoretisch zusätzlich auch den Code

    Quellcode

    1. Pfad_Vorlage = My.Settings.TextBox_Vorlage1
    mit setzen lassen und dies wird an die Form übergeben?

    Die Forms heißen natürlich nicht fast alle gleich. Dies habe ich nur für die Darstellung hier gewählt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MK_CGN“ ()

    MK_CGN schrieb:

    Kann man hier rein theoretisch zusätzlich auch den Code [...} mit setzen lassen und dies wird an die Form übergeben?
    Du kannst an der Stelle jedweden kompilierbaren Code hinschreiben den wolle.

    Und wenn sich die Forms nur an einem einzigen Dateipfad unterscheiden, dann muss das natürlich geändert wern dahingehend, dass nur noch 1 Form geöffnet wird, mit jeweils dem richtigen Dateipfad.