【问题标题】:Refresh and Select Parent Form's Databound Combobox after Edits of Child Form编辑子表单后刷新并选择父表单的数据绑定组合框
【发布时间】:2012-05-01 10:38:06
【问题描述】:

我正在尝试使用新表单中的新信息更新 SQL 数据绑定组合框。在我进行添加/编辑并保存在弹出表单上之后,我想用新信息刷新组合框并选择当前添加/编辑的项目。目前,下面的代码会刷新列表,但不会像我认为的引用变量那样修改父表单上的“myID”。我怎样才能最有效地做到这一点?我有大约 20 个表格可以做类似的事情。

在表格1中

    int newid = 0;
    private void addToolStripMenuItem1_Click(object sender, EventArgs e)
    {
        CoalSeamsForm csf = new CoalSeamsForm(ref newid);
        csf.ShowDialog();
        coalSeamsTableAdapter.Fill(well_Information2DataSet.CoalSeams);
        coalSeamsBindingSource.Find("CoalSeamID", newid);
    }

在表格 2 中

    int myID = 0;

    public CoalSeamsForm(ref int myId)
    {
        this.myID = myId;
        InitializeComponent();
    }

    private void CoalSeamsForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (!isOK)
        {
            if (DialogResult.Yes == MessageBox.Show("Would you like to save the changes?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
            {
                Save();
                DataRowView drv = (DataRowView)coalSeamsBindingSource.Current;
                myID = (int)drv["CoalSeamID"];
            }
        }
    }
}

【问题讨论】:

    标签: c# winforms data-binding pass-by-reference bindingsource


    【解决方案1】:

    这里有问题。我什至不知道这段代码是否编译。 (两个同名的变量?)

    int myID = 0; 
    public CoalSeamsForm(ref int myID) 
    { 
        this.myID = 0; 
        InitializeComponent(); 
    } 
    

    但是您的问题是您在表单构造函数中通过 ref myID 传递,然后您的代码退出。当您在 Form_Closing 中更新 var myID 时,您将不再引用在构造函数中传递的 var。 要解决您的问题,请声明一个全局属性,例如

    public property MyID {get; set;}
    

    然后在构造函数中

    public CoalSeamsForm() 
    { 
        this.MyID = 0; 
        InitializeComponent(); 
    } 
    

    当用户点击确认按钮时更新属性(不在 form_closing 事件中)

       private void ConfirmButton_Click(object sender, EventArgs e)   
       {   
           ...
           this.MyID = (int)drv["CoalSeamID"];   
           this.DialogResult = DialogResult.OK;
       }   
    

    最后在调用时使用属性值

        using(CoalSeamsForm csf = new CoalSeamsForm())
        {
            if(DialogResult.OK == csf.ShowDialog())
            {
                coalSeamsTableAdapter.Fill(well_Information2DataSet.CoalSeams);    
                coalSeamsBindingSource.Find("CoalSeamID", this.MyID);  
            }
        }  
    

    【讨论】:

    • 那我是不是要调用 Form2.Show() 而不是 Form2.ShowDialog() 然后在访问公共属性后关闭?
    • 我现在看到了您的问题。 cdf.ShowDialog() 用于停止调用代码并等待用户使用 csf 表单结束其工作。通常,模式对话框将在某些方法(button_click)中设置 DialogResult 属性而关闭,而不是调用 form.Close() 方法。通过这种方式,代码从 ShowDialog 返回,但窗体未关闭,您可以读取 MyID 属性。我建议以不同的方法更改 MyID 属性的设置(通过 button_click 确认)。我会更新代码
    【解决方案2】:

    引用参数仅在调用方法/构造函数中起作用。一旦它们超出了该单独的方法,它们就会成为第二个对象中的副本。为了实现,根据史蒂夫和其他人的建议,我使用了一个公共属性并从第一种形式访问它。此外,我在发布的代码中使用了一个数据绑定组合框,这是我的一个更典型的应用程序,而不是设置 BindingSource.Position 属性。

    在表格1中

    private void addEditCoalSeams(bool isAdd)
        {
            int? myId=null;
            if (!isAdd)
            {
                myId = (int?)coalSeamsComboBox.SelectedValue;
            }
    
            using (CoalSeamsForm csf = new CoalSeamsForm(myId, isAdd))
            {
                if (DialogResult.OK == csf.ShowDialog())
                {
                    coalSeamsTableAdapter.Fill(well_Information2DataSet.CoalSeams);
                    coalSeamsComboBox.SelectedValue = csf.coalID;
                }
            }
        }
    

    在煤层表格中

        public int? coalID {get; set;}
        bool isAdd = false;
    
        public CoalSeamsForm(int? coalId, bool isAdd)
        {
            this.coalID = coalId;
            this.isAdd = isAdd;
            InitializeComponent();
        }
    
        private void okButton_Click(object sender, EventArgs e)
        {
            Save();
            DataRowView drv = (DataRowView)coalSeamsBindingSource.Current;
            this.coalID = (int)drv["CoalSeamID"];
            this.DialogResult = DialogResult.OK;
        }
    

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多