У меня есть форма, frmPleaseWait
, в которой есть MarqueeProgressBar
и Label
, которые я хочу использовать, когда пользовательский интерфейс загружает данные в плохо структурированное приложение, которое у нас есть.
Проблема в том, что frmPleaseWait.Show()
показывает форму, но не элементы управления в ней. Это просто белый прямоугольник. Теперь frmPleaseWait.ShowDialog()
показывает дочерние элементы управления, но не позволяет пользовательскому интерфейсу загружать свои данные.
Чего мне не хватает? Ниже приведен фрагмент кода, откуда я пытаюсь это сделать.
PleaseWait = new frmPleaseWait();
PleaseWait.Show(this);
// Set all available HUD values in HUD Object
HUD.LastName = GetCurrentRowVal("LastName").Trim();
HUD.FirstName = GetCurrentRowVal("FirstName").Trim();
HUD.PersonId = Convert.ToInt32(GetCurrentRowVal("PersonID").Trim());
HUD.SSn = GetCurrentRowVal("SSN").Trim();
HUD.MiddleName = GetCurrentRowVal("MiddleName").Trim();
HUD.MasterID = ConnectBLL.BLL.DriInterface.CheckForDriId(HUD.PersonId).ToString();
// This loads numerous UserControls with data
shellForm.FormPaint(HUD.PersonId);
PleaseWait.Close();
Редактировать
Продолжайте, основываясь на ответах и моих попытках.
Это то, что у меня есть, но я получаю Cross-Thread Exception
на pleaseWaitInstance.Location = parent.PointToScreen(Point.Empty);
Если я удалю эту строку, она будет работать, но она будет работать в верхнем левом углу экрана MY и игнорировать положение приложения.
public partial class frmPleaseWait : XtraForm
{
public frmPleaseWait()
{
InitializeComponent();
}
private static frmPleaseWait pleaseWaitInstance;
public static void Create(XtraForm parent)
{
var t = new System.Threading.Thread(
() =>
{
pleaseWaitInstance = new frmPleaseWait();
pleaseWaitInstance.FormClosed += (s, e) => pleaseWaitInstance = null;
pleaseWaitInstance.StartPosition = FormStartPosition.Manual;
pleaseWaitInstance.Location = parent.PointToScreen(Point.Empty);
Application.Run(pleaseWaitInstance);
});
t.SetApartmentState(System.Threading.ApartmentState.STA);
t.IsBackground = true;
t.Start();
}
public static void Destroy()
{
if (pleaseWaitInstance != null) pleaseWaitInstance.Invoke(new Action(() => pleaseWaitInstance.Close()));
}
}