Я использую формы и отчеты из старой базы данных Access в приложении C #.Я делаю это, запуская базу данных Access, скрывая главное окно и вызывая процедуру, которая открывает форму или отчет в отдельном окне.
Я получаю отдельное окно, открывая форму или отчет с помощью acDialog.Всплывающая форма также вызвала отдельное окно, но всплывающий отчет этого не сделал.
Формы работают отлично, но я не могу отобразить отчеты, пока я не выполню DoCmd.Maximize in Report_Open .
При максимизации отчет занимает весь экран, что не идеально.Я хочу установить размер отчета по своему выбору, но как встроенная команда Access DoCmd.MoveSize , так и Windows API SetWindowPos приводят к тому, что отчет возвращается в главное окно доступа, чтоскрыт.
Я надеюсь, что кто-то может предложить способ достижения моей цели.
C # код:
class Program
{
private static readonly string DbLocation = "C:\\example.accdb";
[DllImport("user32.dll")]
private static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
private const int KeyDownEvent = 0x0000;
private const int KeyUpEvent = 0x0002;
static void Main(string[] args)
{
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = GetOfficeAppPath("Access.Application", "msaccess.exe"),
Arguments = DbLocation,
WindowStyle = ProcessWindowStyle.Hidden
};
// Simulate holding the Shift key, while opening the application, to bypass startup proceedings.
keybd_event((byte)Keys.LShiftKey, 0, KeyDownEvent, 0);
Process process = Process.Start(startInfo);
process.WaitForInputIdle();
keybd_event((byte)Keys.LShiftKey, 0, KeyUpEvent, 0);
Access.Application exampleApp = (Access.Application)Marshal.BindToMoniker(DbLocation);
try
{
exampleApp.Run("OpenReport", 12345);
}
catch (Exception e)
{
MessageBox.Show($"{e.Message}\n{e.InnerException?.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
exampleApp.CloseCurrentDatabase();
process.Kill();
}
}
}