Abfragen woher ein Form geöffnet wurde

  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    @TS71M:: So:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private dlg2 As Form2
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. Using dlg As New Form2
    5. dlg.ShowDialog()
    6. End Using
    7. End Sub
    8. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    9. If dlg2 Is Nothing OrElse dlg2.IsDisposed Then
    10. dlg2 = New Form2
    11. End If
    12. If Not dlg2.Visible Then
    13. dlg2.Show()
    14. End If
    15. End Sub
    16. End Class
    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!

    TS71M schrieb:

    Jetzt bräuchte ich allerdings einen Tip, wie ich feststellen kann von welchem Form aus aufgerufen wurde.
    vmtl. besser wäre ein Tip, wie du deine Architektur sauber hinkriegst.
    (die Gräuseligkeiten hab ich glaub ja schon in deim anneren Thread gesehen und kurz angesprochen, aber du bist nicht drauf eingegangen - wäre auch zuviel geworden)

    Aber erklär mal: Warum willst du in Form2 wissen, welches Form1 es geöffnet hat?
    @TS71M:: oben Form2 vergessen:

    VB.NET-Quellcode

    1. Public Sub New()
    2. InitializeComponents()
    3. Dim st As New StackTrace()
    4. RichTextBox.Text = st.ToString
    5. End Sub
    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!
    @ErfinderDesRades: Ich habe in der 2. Form variablen die davon abhängen. Wie sonst soll man das lösen?
    (die Gräuseligkeiten hab ich glaub ja schon in deim anneren Thread gesehen und kurz angesprochen, aber du bist nicht drauf eingegangen - wäre auch zuviel geworden)

    Ausserdem hatte ich dir darauf geantwortet und es bewusst verworfen, da es total umständlich für die Usereingabe wäre und hässlich aussieht.
    Ich denke nicht, dass du anhand der Ausschnitte, die du gesehen hast, beurteilen kannst ob dies grauselig ist oder nicht. Ausserdem hat jeder seine eigene Vorstellung, wie was aussehen soll.
    Ich möchte mein 1. Form einfach nicht mit zu vielen Items vollknallen und habe deswegen einige(die nur optional nötig sind) auf ein anderes Form gepackt.

    @RodFromGremany: Danke werd ich gleich mal ausprobieren.
    sry - bist du angepisst wg. des Wortes "Gräuseligkeit"? Das ist als humoristische Ausdrucksweise für "verbesserungsbedürftig" gemeint.

    Sowas muss man halt iwie benennen können, um helfen zu können, und dir kann auch nur geholfen werden, wenn du es aushälst, dass sowas benannt wird.

    @Topic:

    TS71M schrieb:

    Ich habe in der 2. Form variablen die davon abhängen. Wie sonst soll man das lösen?
    Die Variablen in Form2 sind immer gleich, bestenfalls die Werte, die sie enthalten sind unterschiedlich.
    Mehr soll das Form2 auch gar nicht tun: Eingaben entgegennehmen, und in seinen Variablen aufbewahren.

    Nachdem Form2 geschlossen wird, kann Form1 die Variablen auswerten und darauf reagieren. Das wäre saubere Architektur, weil dann Form2 nicht im Form1 herumfuhrwerkelt.
    Dass andersherum Form1 in Form2 herumfuhrwerkelt (etwa Default-Werte setzt) ist ok, denn Form1 ist der Owner von Form2 - es hat letzteres ja erstellt.

    Am einfachsten ist das lösbar über den Dialog-Pattern, also Form2 öffnet als Dialog, d.h. Form1 ist solange blockiert und wartet, bis Form2 wieder geschlossen ist.
    gugge zB DialogResultSample

    TS71M schrieb:

    nicht mit zu vielen Items vollknallen
    Mach Dir einen Konstruktor mit einem Parameter, z.B. ein Enum, der sagt, woher der Aufruf kommt.
    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!
    @ErfinderDesRades: Nein ich war nicht angepisst, nur etwas eingeschnappt, da ich wirklich schon viel Zeit in das Projekt investiert habe und es wie ein "Baby" für mich ist. Und du weisst ja: Nur die Babys der Anderen sind hässlich :D

    Also ich hab's jetzt so gelöst und würde gerne eure Meinung hören.

    Im aufrufenden Form:

    VB.NET-Quellcode

    1. frmPlanAutoInsert.Owner = Me
    2. frmPlanAutoInsert.ShowDialog()


    Und im geöffnete Dialog

    VB.NET-Quellcode

    1. If Owner Is fmAppPlan Then PlanAutoInsertBindingSource = fmAppPlan.AppPlanBindingSource
    2. If Owner Is fmSandPlan Then PlanAutoInsertBindingSource = fmSandPlan.AppPlanBindingSource


    Ich wollte es eigentlich mit einer Select Abfrage machen, aber irgendwie will er nicht:

    Bei:

    VB.NET-Quellcode

    1. Select Case Owner
    2. Case Is fmappplan
    3. End Select

    schreibt er: Relationaler Operator erwartet.

    Also gut, dann so

    VB.NET-Quellcode

    1. Select Case Owner
    2. Case Is = fmappplan
    3. End Select


    Der =-Operator ist für die Type soundso und blablabla nicht definiert.

    Aber bei if Abfrage, kein Problem.

    Und es funktioniert... 8-)

    TS71M schrieb:

    würde gerne eure Meinung hören.
    keine gute Architektur.
    nicht Form2 holt sich die BindingSource aus Form1, sondern Form1 - der Owner - gibt sie in Form2 hinein.

    Im aufrufenden Form:

    VB.NET-Quellcode

    1. frmPlanAutoInsert.PlanAutoInsertBindingSource = Me.AppPlanBindingSource
    2. frmPlanAutoInsert.ShowDialog(Me)
    im geöffnete Dialog braucht dann diesbezüglich garnix mehr zu passieren.

    Noch besser - wie gesagt: Form2 nimmt nur Eingaben entgegen - dazu brauchts die BindingSource garnet.
    Und das autoInserten ist Aufgabe von Form1, denn die BindingSource ist in Form1 erstellt und wird da benötigt - dann soll sie dort auch befüllt werden, und - wenn sichs irgend vermeiden lässt - nicht woanders.

    Hast du dir den Dialog-Sample-Film mal angeguckt?

    TS71M schrieb:

    und würde gerne eure Meinung hören.
    Owner-Instanzen abfragen ist suboptimal.
    Mach Dir ein Enum, das Du im Konstruktor übergibst:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Enum Aufrufer
    2. Form1
    3. Form3
    4. End Enum
    5. Public Class Form1
    6. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    7. Using dlg = New Form2(Aufrufer.Form1)
    8. dlg.ShowDialog()
    9. End Using
    10. End Sub
    11. End Class

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private Property MyCaller As Aufrufer
    3. Public Sub New(aufrufer As Aufrufer)
    4. InitializeComponent()
    5. MyCaller = aufrufer
    6. End Sub
    7. Private Sub bla()
    8. Select Case MyCaller
    9. Case Aufrufer.Form1
    10. Case Aufrufer.Form3
    11. End Select
    12. End Sub
    13. End Class
    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!
    @Rod: nein, das ist Spaghetti-Architektur. Kein Enum, kein Select Case.
    Der Aufrufer soll jeweils seinen Job machen, und das SubForm soll auch nur seinen eigenen Job machen - nicht den des Aufrufers.
    Keine unnötige Kopplung einbauen, sodass das Subform den Datentyp des Aufrufers kennen muss - den muss es nicht kennen!
    Der Aufrufer muss das Subform kennen - sonst kanners ja nicht aufrufen. Aber die Abhängigkeit in Gegenrichtung ist unnötig und schlechte Architektur.

    ErfinderDesRades schrieb:

    das ist Spaghetti-Architektur
    Das ist mir klar.
    Das war auch nur ein "Verbesserungsvorschlag" von wegen (Me) beim Aufruf mitzugeben.
    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!
    @ ErfinderDesRades Natürlich habe ich mir dein Video angeschaut. Ich will ja was lernen.

    Ich würde es auch gerne so

    Noch besser - wie gesagt: Form2 nimmt nur Eingaben entgegen - dazu brauchts die BindingSource garnet.


    machen, nur wie? ?(

    Und vor allem nicht vergessen, dass ich von mehreren Forms auf diesen Dialog zugreifen will.

    Also hier habe ich die beiden Subs die Änderungen vornehmen:

    VB.NET-Quellcode

    1. Private Sub ClearFillRow()
    2. CurrentRw = PlanAutoInsertBindingSource.At(Of AppPlanRow)()
    3. Select Case MessageBox.Show(Me, "Do you want to clear before?", "Add new", MessageBoxButtons.YesNoCancel)
    4. Case Windows.Forms.DialogResult.No
    5. Insert()
    6. Case Windows.Forms.DialogResult.Yes
    7. For i = 22 To 74
    8. CurrentRw(i) = 0
    9. Next
    10. Insert()
    11. Case Windows.Forms.DialogResult.Cancel
    12. Exit Sub
    13. End Select
    14. End Sub
    15. Private Sub Insert()
    16. Dim StartWeek As Integer = GetKW(dtpStart.Value)
    17. Dim EndWeek As Integer = GetKW(dtpEnd.Value)
    18. Dim StartDate As Date = dtpStart.Value
    19. Dim CurrentRw = PlanAutoInsertBindingSource.At(Of AppPlanRow)()
    20. Select Case rbEndsAfter.Checked
    21. Case True
    22. Select Case rbDays.Checked
    23. Case True 'days
    24. EndWeek = GetKW(dtpStart.Value.AddDays((nudApps.Value - 1) * nudPeriod.Value))
    25. For i = StartWeek - 1 To EndWeek Step CInt(nudPeriod.Value / 7)
    26. CurrentRw(i + 22) = nudRate.Value
    27. Next
    28. Case False 'weeks
    29. For i = StartWeek - 1 To EndWeek Step CInt(nudPeriod.Value)
    30. CurrentRw(i + 22) = nudRate.Value
    31. Next
    32. End Select
    33. Case False
    34. Select Case rbDays.Checked
    35. Case True 'days
    36. For i = StartWeek - 1 To EndWeek Step CInt(nudPeriod.Value / 7)
    37. CurrentRw(i + 22) = nudRate.Value
    38. Next
    39. Case False 'weeks
    40. For i = StartWeek - 1 To EndWeek Step CInt(nudPeriod.Value)
    41. CurrentRw(i + 22) = nudRate.Value
    42. Next
    43. End Select
    44. End Select
    45. End Sub


    Muss ich die dann hier heraus nehmen und in die Main einbauen? Wenn ich dann aber unterschiedliche Mains habe, die darauf zugreifen, muss ich es dann in jedem einbauen? Oh Mann, ich muss vor allem noch viel lernen... :S



    Aber wie rufe ich dies jetzt auf?
    ich könnte es dir auch vorkauen, nur müsstest du vollständigen code einstellen, also Form1, wie es Form2 aufruft, und Form2, wie es in Form1 rumfummelt, oder wie auch immer das derzeit gestaltet ist.

    nur so Methoden, ohne zu wissen, wo die drin sind - ist mir zu unbestimmt - hinterher bastel ich was drumrum, was ühaupt nicht passt.
    Kriegst du eine Dialog-Kommunikation nach dem Dialog-Pattern hin?
    also einfach wie in dem Film den Dialog gebastelt, und wie in dem Film aufgerufen und das Dialogresult ausgewertet, obs Dialogresult.Ok ist oder nicht?
    Ok läuft...

    VB.NET-Quellcode

    1. Private Sub AutoInsert_CellContentClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles dgvFertilizer.CellContentClick, dgvFungicide.CellContentClick, dgvHerbicide.CellContentClick, dgvInsecticide.CellContentClick, dgvOther.CellContentClick
    2. With dgvActual.CurrentRow
    3. If e.ColumnIndex = .Cells(8).ColumnIndex And .Cells(1).Value IsNot DBNull.Value And .Cells(7).Value IsNot DBNull.Value Then
    4. fmPlanAutoInsert.ShowDialog()
    5. If fmPlanAutoInsert.DialogResult = Windows.Forms.DialogResult.OK Then ClearFillRow()
    6. End If
    7. End With
    8. End Sub
    9. Private Sub ClearFillRow()
    10. Dim CurrentRw As DataRow = AppPlanBindingSource.At(Of AppPlanRow)()
    11. Select Case MessageBox.Show(Me, "Do you want to clear before, or just adding?", "Auto Insert", MessageBoxButtons.YesNoCancel)
    12. Case Windows.Forms.DialogResult.No
    13. Insert()
    14. Case Windows.Forms.DialogResult.Yes
    15. For i = 22 To 74
    16. CurrentRw(i) = 0
    17. Next
    18. Insert()
    19. Case Windows.Forms.DialogResult.Cancel
    20. Exit Sub
    21. End Select
    22. End Sub
    23. Private Sub Insert()
    24. With fmPlanAutoInsert
    25. Dim StartWeek As Integer = GetKW(.dtpStart.Value)
    26. Dim EndWeek As Integer = GetKW(.dtpEnd.Value)
    27. Dim StartDate As Date = .dtpStart.Value
    28. Dim CurrentRw = AppPlanBindingSource.At(Of AppPlanRow)()
    29. Select Case .rbEndsAfter.Checked
    30. Case True
    31. Select Case .rbDays.Checked
    32. Case True 'days
    33. EndWeek = GetKW(.dtpStart.Value.AddDays((.nudApps.Value - 1) * .nudPeriod.Value))
    34. For i = StartWeek - 1 To EndWeek Step CInt(.nudPeriod.Value / 7)
    35. CurrentRw(i + 22) = .nudRate.Value
    36. Next
    37. Case False 'weeks
    38. For i = StartWeek - 1 To EndWeek Step CInt(.nudPeriod.Value)
    39. CurrentRw(i + 22) = .nudRate.Value
    40. Next
    41. End Select
    42. Case False
    43. Select Case .rbDays.Checked
    44. Case True 'days
    45. For i = StartWeek - 1 To EndWeek Step CInt(.nudPeriod.Value / 7)
    46. CurrentRw(i + 22) = .nudRate.Value
    47. Next
    48. Case False 'weeks
    49. For i = StartWeek - 1 To EndWeek Step CInt(.nudPeriod.Value)
    50. CurrentRw(i + 22) = .nudRate.Value
    51. Next
    52. End Select
    53. End Select
    54. End With
    55. End Sub


    Allerdings habe ich jetzt die beiden Subs im Main. Und dies muss ich jetzt in jedes Form einbauen, das auf den Dialog zugreift? Ist das nicht auch redundant?
    Das läuft?
    da muss man ja nun 2 Dialoge durchklicken.
    Und die Messagebox scheint zu lügen, wenn sie sagt "clear before", denn wenn gecleart wird, dann wird ja nicht mehr befüllt.

    Diese Eingaben entgegennehmen: ob clearen oder befüllen, und wenn ja wie - sowas gehört in den Dialog.

    Aber ich kann immer noch nix machen, weil nu konzeptionell unklar ist, ob der Dialog die Eingabe entgegennimmt für

    Löschung oder Befüllung
    oder
    optional Löschung und Befüllung

    also wie ist der Plan: Soll der Dialog die Eingaben für optional Löschung und Befüllung entgegennehmen? (und die msgbox hinterher entfällt)
    Nein es gibt nur einen Dialog, da es nur einen Button "Insert" gibt. Beim klicken auf den Button öffnet sich die Messagebox.

    Und die Messagebox scheint zu lügen, wenn sie sagt "clear before", denn wenn gecleart wird, dann wird ja nicht mehr befüllt.


    Nein...

    VB.NET-Quellcode

    1. Case Windows.Forms.DialogResult.Yes
    2. For i = 22 To 74
    3. CurrentRw(i) = 0
    4. Next
    5. Insert() 'hier wird an befüllen weitergeleitet.


    also wie ist der Plan: Soll der Dialog die Eingaben für optional Löschung und Befüllung entgegennehmen?


    Könnte man machen, aber was hast du gegen meine MessagBox?
    ich denke, gute Benutzerführung ist, so wenig wie möglich herumklicksen zu müssen, und auch mit sowenig wie möglich aufpoppenden Dialogen konfrontiert zu werden.

    TS71M schrieb:

    Und dies muss ich jetzt in jedes Form einbauen, das auf den Dialog zugreift? Ist das nicht auch redundant?
    ja, da haste recht.
    Aber trotzdem würde ich dem dlgAutoInsert nicht die Daten in Sub New injekten oder sowas, sondern ich würde sie ihm geben genau zum Befüllen und nicht mehr (#4):

    VB.NET-Quellcode

    1. Using dlg = New dlgAutoInsert
    2. If dlg.ShowDialog(Me) <> Windows.Forms.DialogResult.OK Then Return
    3. Dim drv = DirectCast(KrankeTabelleBindingSource(e.RowIndex), DataRowView)
    4. dlg.FillDatarowView(drv)
    5. KrankeTabelleBindingSource.ResetCurrentItem()
    6. End Using


    Aber das ist ja immer noch redundant, denn dasselbe muss ja in den anneren Aufrufer-Forms auch passieren. Kann man auslagern - aber wohin?
    Also ich habs jetzt als Shared Sub ins dlgAutoInsert gepackt, und dann siehts im frmAufrufer so aus:

    VB.NET-Quellcode

    1. Private Sub KrankeTabelleDataGridView_CellContentClick2(sender As Object, e As DataGridViewCellEventArgs) Handles KrankeTabelleDataGridView.CellContentClick
    2. If e.ColumnIndex <> colAutoFill.DisplayIndex Then Return
    3. dlgAutoInsert.TryAutoFill(Me, KrankeTabelleBindingSource)
    4. End Sub
    TryAutoFill ist die korrekte Bezeichnung der Methode, denn wir wissen nicht, ob überhaupt und wenn ja, wie autogefillt wird.

    Und der Dialog (beachte den Unterschied von Shared und ObjektMethode!):

    VB.NET-Quellcode

    1. Public Class dlgAutoInsert
    2. Public Shared Sub TryAutoFill(owner As Form, bs As BindingSource)
    3. Using dlg = New dlgAutoInsert
    4. If dlg.ShowDialog(owner) <> Windows.Forms.DialogResult.OK Then Return
    5. Dim drv = DirectCast(bs.Current, DataRowView)
    6. dlg.FillDatarowView(drv)
    7. bs.ResetCurrentItem()
    8. End Using
    9. End Sub
    10. Public Sub FillDatarowView(drv As DataRowView)
    11. Dim ubound = drv.DataView.Table.Columns.Count - 1
    12. If Me.ActiveControl Is btClearFill Then
    13. For i = 3 To ubound
    14. drv(i) = 0D
    15. Next
    16. End If
    17. ubound = Math.Min(ubound, CInt((MonthCalendar1.SelectionRange.End - MonthCalendar1.SelectionRange.Start).TotalDays))
    18. For i = 3 To ubound
    19. drv(i) = NumericUpDown1.Value
    20. Next
    21. End Sub
    22. End Class


    ps: Die Berechnungen sind für deine Anwendung sicher falsch - hauptsache, es tut sich was.
    Dateien

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

    Hey super, vielen Dank für die Arbeit, die du dir gemacht hast. Hat ein bisschen gedauert durchzusteigen, aber ich denke, ich hab's jetzt.
    Leider funktioniert in deinem Beispiel die "fill" Methode gar nicht.

    Aufrufendes Form

    VB.NET-Quellcode

    1. Private Sub dgvSandGravel_CellContentClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles dgvSandGravel.CellContentClick
    2. With dgvActual.CurrentRow
    3. If e.ColumnIndex <> .Cells(8).ColumnIndex Then Return 'Kann nicht direkt die eine Zelle wählen, da es mehrere DataGridViews sind; aber immer die Zelle 8
    4. If .Cells(1).Value IsNot DBNull.Value And .Cells(7).Value IsNot DBNull.Value Then 'sind MussFelder; sonst gibt's Alarm...
    5. Using dlg As New fmPlanAutoInsert
    6. If dlg.ShowDialog(Me) <> Windows.Forms.DialogResult.OK Then Return
    7. Dim drv = DirectCast(AppPlanBindingSource(e.RowIndex), DataRowView)
    8. dlg.ClearFillRow(drv)
    9. AppPlanBindingSource.ResetCurrentItem()
    10. End Using
    11. End If
    12. End With
    13. End Sub


    Und im AutoInsert

    VB.NET-Quellcode

    1. Public Shared Sub TryAutoFill(ByVal owner As Form, ByVal bs As BindingSource)
    2. Using frmPlanAutoInsert = New fmPlanAutoInsert
    3. If frmPlanAutoInsert.ShowDialog(owner) <> Windows.Forms.DialogResult.OK Then Return
    4. Dim drv = DirectCast(bs.Current, DataRowView)
    5. frmPlanAutoInsert.ClearFillRow(drv)
    6. bs.ResetCurrentItem()
    7. End Using
    8. End Sub
    9. Public Sub ClearFillRow(ByVal drv As DataRowView)
    10. If Me.ActiveControl Is btClearFill Then
    11. For i = 22 To 74
    12. drv(i) = 0D
    13. Next
    14. TryAutoFill(drv)
    15. End If
    16. If Me.ActiveControl Is btInsert Then TryAutoFill(drv)
    17. End Sub
    18. Public Sub TryAutoFill(ByVal drv As DataRowView)
    19. Dim StartWeek As Integer = GetKW(dtpStart.Value) + 21 'Ab Spalte 21
    20. Dim EndWeek As Integer = GetKW(dtpEnd.Value) + 21
    21. Dim StartDate As Date = dtpStart.Value
    22. Select Case rbEndsAfter.Checked
    23. Case True
    24. Select Case rbDays.Checked
    25. Case True 'days
    26. EndWeek = GetKW(dtpStart.Value.AddDays(nudApps.Value * nudPeriod.Value)) + 21
    27. For i = StartWeek - 1 To EndWeek Step CInt(nudPeriod.Value / 7)
    28. drv(i) = nudRate.Value
    29. Next
    30. Case False 'weeks
    31. EndWeek = GetKW(dtpStart.Value.AddDays(nudApps.Value * nudPeriod.Value * 7)) + 21
    32. For i = StartWeek - 1 To EndWeek Step CInt(nudPeriod.Value)
    33. drv(i) = nudRate.Value
    34. Next
    35. End Select
    36. Case False
    37. Select Case rbDays.Checked
    38. Case True 'days
    39. For i = StartWeek - 1 To EndWeek Step CInt(nudPeriod.Value / 7)
    40. drv(i) = nudRate.Value
    41. Next
    42. Case False 'weeks
    43. For i = StartWeek - 1 To EndWeek Step CInt(nudPeriod.Value)
    44. drv(i) = nudRate.Value
    45. Next
    46. End Select
    47. End Select
    48. End Sub

    Funzt... :thumbsup:

    Allerdings noch eine Frage dazu:
    Das läuft

    VB.NET-Quellcode

    1. If Me.ActiveControl Is btClearFill Then
    2. For i = 22 To 74
    3. drv(i) = 0D
    4. Next
    5. TryAutoFill(drv)
    6. End If
    7. If Me.ActiveControl Is btInsert Then TryAutoFill(drv)


    Aber warum das nicht??? ?(

    VB.NET-Quellcode

    1. Select Case Me.ActiveControl
    2. Case Is btClearFill
    3. Case Is btInsert
    4. End Select