2

以下は、app.config ファイル内の接続文字列です。データソースで指定されたパスに注意してください。

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
  <add name="ConnString" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data  Source=..\..\Database\ProductsDatabase.accdb;Persist Security Info=False;" providerName="System.Data.SqlClient"/>
    </connectionStrings>
</configuration>

アプリケーションには、MouseDoubleclick イベントを持つボタン コントロール内にイメージ コントロールがあります。

                        <Button Name="m_oBtnProductImage" Grid.Column="0"  Height="60" Width="60" Background="LightGray" Style="{x:Null}" MouseDoubleClick="m_oBtnProductImage_MouseDoubleClick">
                                <Image Tag="Image" Name="m_oImage" Stretch="Fill" Source="{Binding SelectedProductEn.ProductImage}"></Image>
                        </Button>

MouseDoubleclick イベント ハンドラーには、新しい画像を参照してアップロードし、データベースで同じ画像を更新する機能があります。

private void m_oBtnProductImage_MouseDoubleClick(object sender, RoutedEventArgs e)
    {
        Bitmap oBitmapImage = null;
        OpenFileDialog oBrowseImageFile = new OpenFileDialog();
        oBrowseImageFile.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp";
        if (oBrowseImageFile.ShowDialog() == true)
        {
            System.Windows.Controls.Image oPictureBox = ((Button)sender).FindName("m_oImage") as System.Windows.Controls.Image;
            string sImagePath = oBrowseImageFile.FileName;
            oBitmapImage = new Bitmap(sImagePath);
            ((CMainUIViewModel)this.DataContext).SelectedProductEn.ProductImage = (byte[])TypeDescriptor.GetConverter(oBitmapImage).ConvertTo(oBitmapImage, typeof(byte[]));
            ((CMainUIViewModel)this.DataContext).UpdateModifiedProduct(((CMainUIViewModel)this.DataContext).SelectedProductEn);
        }
    }

アプリケーションの UI から画像を参照すると、データソースで指定されたパスが参照された画像ファイルのパスに変更されるため、データベースが見つからないという例外がスローされます。

適切な変更を行うために必要な提案。

4

1 に答える 1

0

手っ取り早い解決策は、RestoreDirectoryを trueに設定することです。

oBrowseImageFile.RestoreDirectory = true;
if (oBrowseImageFile.ShowDialog())
{
    ...
}

より良い解決策は、接続文字列で相対パスを使用しないことです。

  • |DataDirectory| を使用 接続文字列で

  • AppDomain.CurrentDomain.SetData("DataDirectory", somepath)|DataDirectory| によって参照される場所を設定するために、アプリケーションの起動時に呼び出します。たとえば、次のように、実行可能ファイルを含むディレクトリに設定できます。

    AppDomain.CurrentDomain.SetData("DataDirectory", 
        AppDomain.CurrentDomain.BaseDirectory);
    

ちなみに、 は をOpenFileDialog実装IDisposableしているので、実際には を呼び出す必要がありますIDisposable.Dispose。おそらく次のusingステートメントを使用します。

using (OpenFileDialog oBrowseImageFile = new OpenFileDialog())
{
    oBrowseImageFile.Filter = ...
    ... etc ...
}
于 2012-12-04T10:08:30.670 に答える