winforms 让两个窗体保持彼此的示例是不是一个坏主意?

ztmd8pv5  于 2023-02-24  发布在  其他
关注(0)|答案(1)|浏览(110)

我是一名学生,我对良好的编程实践知之甚少,我有一个Visual Basic窗体,其中有一个DataGirdView,当你点击其中一列时,它应该打开另一个窗体(ventanaMod),让你编辑特定行的数据。
我已经设法让程序做我想用这段代码。

Private Sub dgvNotas_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvNotas.CellDoubleClick
        Dim selectedRow As DataRow
        selectedRow = dgvNotas.DataSource.Rows(e.RowIndex)
        Dim ventanaMod As New Modificar(selectedRow, Me)
        Me.Hide()
        ventanaMod.Show()
End Sub

我希望它隐藏而不关闭,它的行为方式我希望它,但为了再次打开它,我需要存储另一个窗体作为变量(ventanaOrig)

Dim ventanaOrig As Form1

    Public Sub New(registro As DataRow, pventanaOrig As Form1)
        InitializeComponent()
        lblName.Text = registro("Nombre")
        lblApellidos.Text = registro("Apellidos")
        txtCiclo.Text = registro("Ciclo")
        txtCurso.Text = registro("Curso")
        txtVB.Text = registro("Nota1")
        txtAndr.Text = registro("Nota2")
        txtPy.Text = registro("Nota3")
        txtAws.Text = registro("Nota4")
        txtNav.Text = registro("Nota5")
        txtWpf.Text = registro("Nota6")
        txtEmpr.Text = registro("Nota7")
        txtEng.Text = registro("Nota8")
        TxtQV.Text = registro("Nota9")
        ventanaOrig = pventanaOrig
End Sub

这意味着我在主窗体中有一个修改窗体示例,在修改窗体中有一个主窗体示例,我想知道这是否会产生任何问题,以及我可以用什么其他方法来解决这个问题。

Private Sub Modificar_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
        ventanaOrig.Show()
End Sub

这也是我的代码的一部分,它使用Main窗体的示例在我关闭窗口时打开它

zbdgwd5y

zbdgwd5y1#

您必须了解modal dialog box and a modeless dialog box
如果窗体打开了模式对话框,则该窗体将变为非活动状态。在继续处理窗体之前,必须填写模式对话框并将其关闭(“确定”或“取消”)。在windows标准用户界面中,窗体仍然可见,但不能变为活动状态。请注意,windows用户期望这种行为。模式对话框的常见示例是"* 文件-打开 *“对话框。
如果窗体打开一个非模式对话框,则窗体和非模式对话框都可以变为活动状态。两个窗体都可以进行编辑、移动、最小化等操作。
如果我看你想要什么,你想显示一个模态对话框。作为一个额外的,你想隐藏你的主窗体,而模态对话框是可见的。请注意,这是一个偏离标准的windows用户界面。操作员不会期望这一点,他们开始认为:嘿,我的应用程序在哪里。2如果操作员决定最小化所有窗口(如何再次显示?3),或者关闭应用程序,或者关闭窗口,你也必须解决这个问题。4我的建议是:坚持使用标准的windows用户界面。
我不确定该对话框是否仅用于向操作员显示信息,或者操作员是否需要提供在操作员指示他已完成编辑(=按下“确定”)后必须传递到主窗体的信息
我的visual basic很生疏,所以我不能给予你VB的代码。作为例子,我会给你C#代码。我相信你会得到要点。
class ExtraInformation {...//用于在窗体和模式对话框之间进行通信的属性// TODO:发明适当的类名}
如果只想显示额外信息,操作员不必在模态对话框中输入信息,请使用以下命令:
void显示额外信息(额外信息额外信息){使用(MyExtraDialogBox dlg = new MyExtraDialogBox(){ //用额外信息填充对话框:dlg.设置初始值(额外信息);

// only if you want to deviate from windows standard:
       this.Visible = false;

       // show the dialog box, and wait until closed:
       dlg.ShowDialog(this);   // this: I am the parent window

       // if you hid this form, show it again
       this.Visible = true;
    }
}

当然,您必须创建MyExtraDialogBox.SetInitialValues,此方法将填充所有必须显示的值。
如果您想显示额外的信息,让操作员添加一些输入并使用操作员输入:

class OperatorInput     // TODO: invent proper name
{
    ...
}

OperatorInput GetOperatorInput (ExtraInformation extraInformation)
{
    using (MyExtraDialogBox dlg = new MyExtraDialogBox()
    {
        // fill the dialog box with the extraInformation:
        dlg.SetInitialValues(extraInformation);

        // only if you want to deviate from windows standard:
        this.Visible = false;

        // show the dialog box, and wait until closed:
        DialogResult dlgResult = dlg.ShowDialog(this);

        // if you hid this form, show it again
        this.Visible = true;

        OperatorInput operatorInput = dlg.GetOperatorInput();
        return operatorInput;
     }
 }

您需要一个从选定行提取ExtraInformation的过程和一个处理操作员输入的过程:

ExtraInformation CreateExtraInformation(DataGridViewRow selectedRow) {...}
void ProcessOperatorInput(OperatorInput operatorInput {...}

实现超出了狗屎问题的范围。

// TODO: invent a proper method name
void ShowInformationAndProcessOperatorInput(DataGridViewRow row)
{
    // extract the ExtraInformation:
    ExtraInformation extraInformation = this.CreateExtraInformation(row);

    // show the dialog box to show the extraInformation and process the operator input
    OperatorInput operatorInput = this.GetOperatorInput(extraInformation);
    this.ProcessOperatorInput(operatorInput);
}

最后,单击单元格的事件处理程序非常小:

void CellContentClick(Object sender, DataGridViewCellEventArgs e)
{
    DataGridViewRow selectedRow = this.DataGridView1.Rows(e.RowIndex);
    ShowInformationAndProcessOperatorInput(selectedRow);
}

我创建了只有一个任务的小过程。这样这些过程更容易理解。它们可以很容易地进行单元测试。更容易重用它们。例如:假设您要添加一个按钮或菜单项,该按钮或菜单项对当前选定的单元格执行与双击相同的操作:

void OnButtonShowData_Clicked(object sender, ...)
{
    DataGridViewRow selectedRow = this.GetSelectedRow();
    ShowInformationAndProcessOperatorInput(selectedRow);  
}

除了可重用性之外,小的更改几乎不会影响代码的其余部分。例如,如果您希望显示选定行的多一点或少一点,大多数过程不会更改

相关问题