Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在关闭另一个窗口时从窗口更新组合框?_C#_Winforms - Fatal编程技术网

C# 如何在关闭另一个窗口时从窗口更新组合框?

C# 如何在关闭另一个窗口时从窗口更新组合框?,c#,winforms,C#,Winforms,首先,我想为以下几点道歉: 软件是葡萄牙语的 这个软件非常难看。这是一个学校项目,我们决定更多地关注功能性而不是设计(我知道,这是错误的,但我们必须选择…) 我读了,但我不明白发生了什么 也就是说,让我们来讨论这个问题 我有一扇窗户: 如果单击红色标记的按钮: 这将打开: 这应该是一个面向市场的软件。第一个窗口负责向库存订购更多物品。第二个窗口负责将供应商添加到系统中 组合框显示系统上的所有供应商。我想,当我在第二个窗口上完成添加供应商后,单击以红色矩形突出显示的按钮,组合框将自动更新

首先,我想为以下几点道歉:

  • 软件是葡萄牙语的
  • 这个软件非常难看。这是一个学校项目,我们决定更多地关注功能性而不是设计(我知道,这是错误的,但我们必须选择…)
  • 我读了,但我不明白发生了什么
也就是说,让我们来讨论这个问题

我有一扇窗户:

如果单击红色标记的按钮:

这将打开:

这应该是一个面向市场的软件。第一个窗口负责向库存订购更多物品。第二个窗口负责将供应商添加到系统中

组合框显示系统上的所有供应商。我想,当我在第二个窗口上完成添加供应商后,单击以红色矩形突出显示的按钮,组合框将自动更新新数据

我使用了一个“更新”按钮,代码如下:

this.tb_FornecedorTableAdapter.Fill(this.tccDataSet.tb_Fornecedor);

它起作用了,但我尝试在其他窗口的
FormClosing
FormClosing
Deactivate
事件上使用,但根本不起作用(我将代码上的“this”修改为很多,这对我没有帮助)。有没有办法做我想做的事

在这种情况下,您可以在子窗体上添加一个属性来存储组合框值,并在组合框值更改时填充它。另外,在子窗体上创建将从父窗体调用的方法。它将显示子窗体并返回组合框值

public partial class ChildForm : Form
{
    public ChildForm()
    {
        InitializeComponent();
    }

    private string _comboValue { get; set; }

    public string ShowAndGetComboValue()
    {
        this.ShowDialog();

        return _comboValue;
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        _comboValue = comboBox1.SelectedItem.ToString();
    }
}
在父窗体上,可以通过以下方式显示子窗体:

ChildForm form = new ChildForm();
string comboValue = form.ShowAndGetComboValue();

在第一个窗口中声明公共方法:

public void RefreshCombo()
{
this.tb_FornecedorTableAdapter.Fill(this.tccDataSet.tb_Fornecedor);
}
然后在第一个窗口中单击“添加”按钮“事件”

WindowB window=new WindowB(this);
WindowB.Show();
然后在子窗口中添加一个ctor方法:

private WindowA windowParent;

public WindowB(WindowA parent)
{
InitializeComponent();
this.windowParent=parent;     
}
在WindowB窗体关闭事件中

this.windowParent.RefreshCombo()

如果使用SQL Server中的数据更新组合框,则可以尝试以下操作:

// When button Adicionar is clicked
private void buttonAdd_Click(object sender, EventArgs e)
{
    using(Form formAdd = new Form()) // This is the Gerenciar Fornecedor form
    {
        formAdd.ShowDialog(this); // Show the form. The next statement will not be executed until formAdd is closed
        // Put the your code to update the ComboBox items here
    }
}

我想我明白你的逻辑,但是什么样的东西会存储在“\u combovalue”上呢?第二个窗口将创建ShowAndGetComboValue()?您可以看到如何使用
\u combovalue
。是的,您是对的,
ShowAndGetComboValue()
是在第二个窗口中设置的。“comboBox1.Items.AddRange(新字符串[]{“1”、“2”、“3”);“AddRange?”?我从SQL Server获取数据。。。这是个问题吗?是的,对不起,那是我的测试。我从上面的代码中删除了它。第一个代码块将全部转到第二个窗口?“private void combobox 1\u SelectedIndexChanged(object sender,EventArgs e)”在那里不起作用,因为combobox位于第一个屏幕上。。。我弄错了?你的第三段代码,你能解释一下它的功能吗?我无法理解和存储WindowA实例,因此您可以方便地在WindowB中使用该实例。请尝试此代码并进行调试,您就会理解。抱歉,我无法打开图片。是否存在异常?不,将显示此异常。这是预期的吗?您键入的是“parent”而不是“parent”,因此我认为您指的是变量而不是类是的,您是对的,我想使用该变量。试试这个。windowParent.RefreshCombo()我正在测试所有建议,但您的代码到目前为止仍然有效。谢谢D@athosbr99-以这种方式使用
formAdd
会导致内存泄漏,如果在正常使用过程中多次显示,则会很明显。最好将它包装在
using
子句中,比如
using(var formAdd=new formAdd()){…}
。请参阅MSDN上关于在之后调用
Dispose()
的说明。