Установка положения запуска для OpenFileDialog/SaveFileDialog

Сначала обновите ваш метод Create GET следующим образом:

public async Task<IActionResult> Create()
{
    var teachers = await _context.Teachers.Where(t => t.Class == null).ToListAsync();
    ViewData["Teachers"] = new SelectList(teachers,"ID","FullName");
    return View();
}

Затем напишите свой FormGroup для select list следующим образом:

<div class="form-group">
     <label asp-for="TeacherID" class="control-label">Teacher</label>
     <select asp-for="TeacherID" class ="form-control" asp-items="ViewBag.Teachers">
     </select>
     <span asp-validation-for="TeacherID" class="text-danger"></span>
</div>

Теперь обновите свой Create POST метод следующим образом:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Class @class)
{
    if (ModelState.IsValid)
    {
        _context.Classes.Add(@class); // now your @class is containing the `TeacheID` value selected from drop-down.
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    return View("Index");
}

Теперь все должно работать нормально!

22
задан animuson 16 October 2013 в 17:45
поделиться

5 ответов

Я подозреваю, что лучше всех вы можно сделать, это убедиться, что вы используете перегрузку для ShowDialog , которая принимает IWin32Window для использования в качестве родительского. Это может помочь ему выбрать подходящее место; чаще всего:

using(var dlg = new OpenFileDialog()) {
    .... setup
    if(dlg.ShowDialog(this) == DialogResult.OK) {
        .... use
    }
}
4
ответ дан 29 November 2019 в 05:54
поделиться

OpenFileDialog и SaveFileDialog располагаются в верхнем левом углу клиентской области последнего отображаемого окна. Так что просто создайте новое невидимое окно, расположенное там, где вы хотите, чтобы диалоговое окно появлялось, прежде чем создавать и показывать это диалоговое окно.

Window dialogPositioningWindow = new Window();
dialogPositioningWindow.Left = MainWindow.Left + <left position within main window>;
dialogPositioningWindow.Top  = MainWindow.Top  + <top  position within main window>;
dialogPositioningWindow.Width = 0; 
dialogPositioningWindow.Height = 0; 
dialogPositioningWindow.WindowStyle = WindowStyle.None;
dialogPositioningWindow.ResizeMode = ResizeMode.NoResize;
dialogPositioningWindow.Show();// OpenFileDialog is positioned in the upper-left corner
                               // of the last shown window (dialogPositioningWindow)
Microsoft.Win32.OpenFileDialog dialog = new Microsoft.Win32.OpenFileDialog();
...
if ((bool)dialog.ShowDialog()){
   ...
}
dialogPositioningWindow.Close();
1
ответ дан 29 November 2019 в 05:54
поделиться

Вот как я это сделал:

Точка, в которой я хочу отобразить OpenFileDialog:

Thread posThread = new Thread(positionOpenDialog);
posThread.Start();

DialogResult dr = ofd.ShowDialog();

Код репозиции:

[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);


/// <summary>
/// Find the OpenFileDialog window when it appears, and position it so
/// that we can see both dialogs at once.  There is no easier way to
/// do this (&^%$! Microsoft!).
/// </summary>
private void positionOpenDialog ()
{
    int count = 0;
    IntPtr zero = (IntPtr)0;
    const int SWP_NOSIZE = 0x0001;
    IntPtr wind;

    while ((wind = FindWindowByCaption(zero, "Open")) == (IntPtr)0)
        if (++count > 100)
            return;             // Find window failed.
        else
            Thread.Sleep(5);

    SetWindowPos(wind, 0, Right, Top, 0, 0, SWP_NOSIZE);
}

Я запускаю Поток, который ищет окно с заголовком «Открыть». (Обычно встречается за 3 итерации или 15 миллисекунд.) Затем я устанавливаю его положение с помощью полученного дескриптора. (См. Документацию SetWindowPos для параметров позиции / размера.)

Kludgy.

1
ответ дан 29 November 2019 в 05:54
поделиться

Существует довольно старый пример одного подхода в MSDN.

http://msdn.microsoft.com/en-us/library/ms996463.aspx

Включает весь код, необходимый для реализации вашего собственного класса OpenFileDialog, который обеспечивает расширяемость.

0
ответ дан 29 November 2019 в 05:54
поделиться

Прочтите эту статью на CodeProject. Отрывок:

Вот когда удобный .NET NativeWindow появляется на картинке, NativeWindow - это оконная оболочка, в которой он обрабатывает сообщения, отправленные связанный с ним дескриптор. Это создает NativeWindow и связывает Дескриптор OpenFileWindow к нему. Из этого точка, каждое сообщение, отправленное на OpenFileWindow будет перенаправлен на наш собственный метод WndProc в Вместо этого NativeWindow, и мы можем отменить, изменить или позволить им пройти через.

В нашем WndProc мы обрабатываем сообщение WM_WINDOWPOSCHANGING. Если открытый открывается диалог, тогда мы изменим исходный горизонтальный или вертикальный размер в зависимости от StartLocation устанавливается пользователем. Это увеличит размер создаваемого окна. Эта происходит только один раз, когда открыто.

Также мы обработаем сообщение WM_SHOWWINDOW. Здесь все элементы управления внутри исходного OpenFileDialog находятся создан, и мы собираемся добавить наш контроль в диалоге открытия файла. Это делается путем вызова Win32 API. SetParent. Этот API позволяет вам изменить родительское окно. Тогда в основном что он делает, это прикрепляет наш контроль к исходному OpenFileDialog в место, которое он устанавливает, в зависимости от значение свойства StartLocation.

Преимущество этого метода в том, что мы по-прежнему иметь полный контроль над элементы управления, прикрепленные к Окно OpenFileDialog. Это означает, что мы может получать события, методы вызова и делаем с ними все, что хотим управления.

4
ответ дан 29 November 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: