none
usercontrol mit dependencyproperty lässt sich nur ein mal aufrufen RRS feed

  • Frage

  • hello,

    mein erstes wpf-projekt verläuft etwas unglücklich...

    vorhaben:

    access.mdb's gehen manchnchmal kaputt, da möchte ich ein rettungsprogramm schreiben.

    userinterface:

    auf der einen seite soll die zu rettende datenbank geladen und angezeigt werden, auf der rechten seite die wo die daten übertragen (gerettet) werden.

    daher möchte ich den code nicht zwei mal schreiben und habe mir gedacht, dies dynamisch über ein usercontrol zu lösen.

    problem:

    das ist auch bis dahin kein problem, sobald aber der pfad zur mdb an ein dependencyproperty gebunden wird, kann nur eine instanze geladen werden, das zweite usercontrol lässt sich nicht laden...

    frage:

    mache ich was falsch, oder gibt das wpf nicht her?

     

    code usercontrol

    <UserControl x:Class="CONTROLS.DatabaseCtl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        mc:Ignorable="d"
        d:DesignHeight="100" d:DesignWidth="200">
       
        <Grid Name="VollGrid">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="4*" />
                    <ColumnDefinition Width="3*"  />
                </Grid.ColumnDefinitions>
         
            <DockPanel Grid.Column="0">
                <Expander Name="expDatenbankTables" Header="Tables" DockPanel.Dock="Top" >
                    <TextBlock TextWrapping="WrapWithOverflow" Foreground="Gray">
                        Hier werden alle zugreifbaren Tabellen angezeigt. Es werden nur die bearbeitet welche sie sehen, daher entfernen sie die nicht benötigten.
                    </TextBlock>
                </Expander>
                <ListBox Name="lboTables"></ListBox>
            </DockPanel>
           
            <StackPanel Name="stpRechts" Grid.Column="1" Background="LightGray">

                <Expander Name="expExportiereTablesMitData" Header="Export Tables mit Data" >
                    <StackPanel>
                        <TextBlock TextWrapping="WrapWithOverflow" Foreground="Gray">
                            kopiere komplette Tabelle mit Struktur und Daten über eine Access.Application.DoCmd;
                            nicht möglich wenn tabellen bereits existieren oder Datenbank irreperarable beschädigt ist
                         </TextBlock>
                        <Button Name="btnStartTblTransferDoCmdDatabase">Start</Button>
                        <TextBlock TextWrapping="WrapWithOverflow" Foreground="Gray">
                            kopiere komplette Tabelle mit Struktur und Daten über dao36 tableDefs.Add();
                            nicht möglich wenn tabellen bereits existieren.
                        </TextBlock>
                        <Button Name="btnStartTblTransferDaoTableDefs">Start</Button>
                    </StackPanel>
                </Expander>

                <Expander Name="expExportiereTablesMitDataÜberSqlExecute" Header="Data insert or Create" >
                    <StackPanel>
                        <TextBlock TextWrapping="WrapWithOverflow" Foreground="Gray">
                                kopiere komplette table mit Struktur und Daten über Dao36;
                                bestehen die Tabellen bereits, werden die Daten nur angefügt nicht aktualisiert, keine Tabellenerstellung;
                                bei bestehenen Strukturen müssen sie 1:1 beim Sender wie beim Empfänger gleich sein sonst Fehler.
                            </TextBlock>
                        <Button Name="btnStartTblUndDataTransferDaoSqlExecute">Start</Button>
                    </StackPanel>
                </Expander>
            </StackPanel>
            <GridSplitter HorizontalAlignment="Right" Background="Brown" ShowsPreview="True" Width="5" />
        </Grid>
    </UserControl>

     

    ein teil des usercontrol codes

     

    Namespace CONTROLS

        Partial Public Class DatabaseCtl
            ' -------------------------------------------------------------
            ' fk neu 2010_0219
            ' -------------------------------------------------------------

    #Region "Members"
            Dim _strClassName As String = "BL.DatenbankRettung.dll.App.Controls.DatataseCtl"
            ' -------------------------------------------------------------
            Dim _DatabasePfadNameProperty As DependencyProperty = DependencyProperty.Register("DatabasePfadNameProperty", _
                                                                                              GetType(String), _
                                                                                              Me.GetType, _
                                                                                              New PropertyMetadata(String.Empty, New PropertyChangedCallback(AddressOf onDatabasePathNameChanged)))

            Dim _DatabaseEmpfängerPfadNameProperty As DependencyProperty = DependencyProperty.Register("DatabaseEmpfängerPfadNameProperty", GetType(String), Me.GetType)

    #End Region

    #Region "Constructors"
            Public Sub New()
                InitializeComponent()
            End Sub

    #End Region

    #Region "Propertys"

                   Public Property DatabasePfadNameProperty() As String
                Get
                    Return CStr(GetValue(_DatabasePfadNameProperty))
                End Get
                Set(ByVal value As String)
                    SetValue(_DatabasePfadNameProperty, value)
                End Set
            End Property

            Public Property DatabaseEmpfängerPfadNameProperty() As String
                Get
                    Return CStr(GetValue(_DatabaseEmpfängerPfadNameProperty))
                End Get
                Set(ByVal value As String)
                    SetValue(_DatabaseEmpfängerPfadNameProperty, value)
                End Set
            End Property


    #End Region

    Private Sub txtDatenbankLinks_LostFocus(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles txtDatenbankLinks.LostFocus
                My.Settings.SenderDatenbankPfadName = txtDatenbankLinks.Text
            End Sub

    Private Sub txtDatenbankRechts_LostFocus(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs)
                My.Settings.EmpfängerDatenbankPfadName = txtDatenbankRechts.Text
    End Sub

     

     

    ...

     

    end class

    End Namespace

     

     

    hier der code des main-forms

     

    <Window x:Class="FORMS.frmMainWithUserControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:Controls="clr-namespace:App.CONTROLS;assembly=BL.DatenbankRettung"
        Title="Datenbank Rettung Access 2000" Height="525.872" Width="998.871">
        <Grid >
            <Grid.ColumnDefinitions>
                <ColumnDefinition  />
                <ColumnDefinition  />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="375*" />
            </Grid.RowDefinitions>
            <GridSplitter Grid.Column="1"
                  VerticalAlignment="Stretch"
                   HorizontalAlignment="Left"
                   Background="blue"
                  ShowsPreview="True"
                   Grid.RowSpan="1"
                  Width="5"
                  Margin="0.252,0,0,0"/>
           
            <DockPanel Grid.Column="0">
                <Menu  DockPanel.Dock="Top" >
                    <TextBlock Text="Access Datenbank" ></TextBlock>
                    <TextBox Name="txtDatenbankLinks" Width="177"></TextBox>
                    <Button Name="btnDatenbankLinksÖffnen" >...</Button>
                </Menu>
                <Controls:DatabaseCtl
                    Name="DBCtlLinks"
                    DockPanel.Dock="Top"
                    DatabasePfadNameProperty="{Binding ElementName=txtDatenbankLinks ,Path=Text}"
                    DatabaseEmpfängerPfadNameProperty="{Binding ElementName=txtDatenbankRechts,Path=Text}"
                    VerticalAlignment="Stretch"
                    HorizontalAlignment="Stretch">
                </Controls:DatabaseCtl>
            </DockPanel>
           
            <DockPanel Grid.Column="1">
                <Menu  DockPanel.Dock="Top" >
                    <TextBlock Text="Access Datenbank" Grid.Column="1"></TextBlock>
                    <TextBox Name="txtDatenbankRechts" Width="177"></TextBox>
                    <Button Name="btnDatenbankRechtsÖffnen" >...</Button>
                </Menu>
                <Controls:DatabaseCtl
                    Name="DBCtlrechts"
                    DockPanel.Dock="Top"
                    DatabasePfadNameProperty="{Binding ElementName=txtDatenbankRechts ,Path=Text}"
                    DatabaseEmpfängerPfadNameProperty="{Binding ElementName=txtDatenbankLinks ,Path=Text}"
                    VerticalAlignment="Stretch"
                    HorizontalAlignment="Stretch">
                </Controls:DatabaseCtl>

            </DockPanel>
        </Grid>
    </Window>

    Samstag, 10. April 2010 16:13

Alle Antworten

  • Für eine Reproduktion deines Problems ist der Code nicht vollständig und fehlerhaft (setze Option Strict On).

    Zusätzlich ist zu bemerken, dass Access-Datein bei richtigem Zugriff nur bei plötzlichem Stromausfall kaputtgehen. Deshalb sollte mal über USV's nachgedacht werden. Falls Access-Dateien auch ohne Stromausfall korrupt werden, sollten die fehlerhaften zugreifenden Anwendungen korrigiert werden.

     

    --
    Peter

    Samstag, 10. April 2010 18:16
  • hello,

    habe drei änderungen vorgenommen, die nun bei "option strict on" nicht mehr angemeckert werden.

     

    einen "unfall" welchen eine mdb erleiden kann ist mannigfaltig und kann fast mit dem strassenverkehr verglichen werden.

    hier wie da kann man viele vorkehrungen treffen solche "unfälle" zu vermeiden. tatsache ist das es im strassenverkehr nicht umsonst krankenwagen gibt, die besonders schwere fälle bearbeiten. das hier soll ein ebenbild in net werden.

    Sonntag, 11. April 2010 15:02
  • In meiner weit über 10-jährigen Erfahrung mit Access-Dateien sind mir seit der Nutzung der Jet 4.0 (seit Access 2000) nur korrupte Access-Dateien untergekommen, die bei Stromausfällen, Netz-Instabilitäten und Programmierfehler entstanden. Nach Beseitigung der Programmierfehler gab es keine Probleme mehr, wenn die Hardware stabil war. Hauptursache der Programmierfehler waren fehlendes Schließen der Datenbankdatei (z.B. bei der Nutzung der Fehlerkennung für die Programmsteuerung), häufiges Öffnen und Schließen im Mehrnutzerbtrieb (Schreibzugriffe auf die ldb) und unzureichende gegenseitige Berücksichtung paralleler Zugriffe.

    Aus diesen Gründen kann ich nicht verstehen, man die Ergebnisse eines Programmes mit Zufälligkeiten im Straßenverkehr vergleichen kann.

    --
    Peter

    Sonntag, 11. April 2010 18:40