首页 > 解决方案 > c#:如何将组合框选定值从一个表单传递到另一个表单

问题描述

我有两种形式,“FrmRunEntry”和“FrmPartNumEntry”。当我在 FrmRunEntry 表单上输入一个值时,它会显示 FrmPartNumEntry from 和一个组合框。在组合框中选择一个值后,我想按 ENTER 键并将所选值从组合框中带回 FrmRunEntry 表单上的文本框。但我无法让它工作。我的组合框和表单 Keydown 事件永远不会被触发。我的程序只是放在组合框上,按 ENTER 后什么也不做。我已经广泛搜索论坛并尝试了以下解决方案但没有成功:

如何将值从一种形式传递到另一种形式的组合框中

如何在 C# 中将 Combobox 的选定项目从一个表单获取到另一个表单

我还尝试了其他一些不起作用的解决方案。我是一名新的 C# 程序员,我承认我对 C# 事件的工作原理没有深入的了解。我希望有人可以帮助解决这个问题并帮助我理解我做错了什么。这是我正在使用的代码:

FORM 1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace HydroProgram
{
    public partial class FrmRunEntry : Form
    {
        public string selectedPartNumber = "";

        public FrmRunEntry()
        {
            InitializeComponent();
            this.ActiveControl = TxtHydro;
            TxtHydro.Focus();
        }

        private void FrmRunEntry_Load(object sender, EventArgs e)
        {
            //Text Boxes
            TxtHydro.CharacterCasing = CharacterCasing.Upper;

            if (!string.IsNullOrEmpty(selectedPartNumber))
            {
                TxtPartNum.Text = selectedPartNumber;
            }
        }

 
        private void TxtHydro_KeyDown(object sender, KeyEventArgs e)
        
        {
            if (e.KeyCode == Keys.Enter)
            {
                this.Hide();
                FrmPartNumEntry f = new FrmPartNumEntry();
                f.ShowDialog();
            }
        }
    }
}


FORM 2

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace HydroProgram
{
    public partial class FrmPartNumEntry : Form
    {
        public FrmPartNumEntry()
        {
            InitializeComponent();
            this.ActiveControl = CboPartNum;
        }

        private void FrmPartNumEntry_Load(object sender, EventArgs e)
        {
            //Combo Box
            CboPartNum.Location = new Point(668, 240);
            CboPartNum.Size = new Size(255, 23);
            CboPartNum.Focus();
            CboPartNum.SelectedIndex = 1;
        }

        private void CboPartNum_KeyDown(object sender, KeyEventArgs e)              <-- NOT BEING TRIGGERED
        {
            processRequest(e);
        }

        private void FrmPartNumEntry_KeyDown(object sender, KeyEventArgs e)         <-- NOT BEING TRIGGERED
        {
            processRequest(e);
        }

        private void processRequest(KeyEventArgs e)                     <-- NEVER REACHED
        {
            if (e.KeyCode == Keys.Enter && this.ActiveControl == CboPartNum)
            {
                this.Hide();
                FrmRunEntry f = new FrmRunEntry();
                f.selectedPartNumber = Convert.ToString(CboPartNum.SelectedItem);
                f.ShowDialog();
            }
        }
    }
}

标签: c#winformscombobox

解决方案


例如,您可以重载表单的构造函数

public FrmPartNumEntry()
{
    InitializeComponent();
    this.ActiveControl = CboPartNum;
}

至此

public public FrmPartNumEntry(int value)
{
    InitializeComponent();
    this.ActiveControl = CboPartNum;
}

然后将值存储在私有变量中。然后,您可以随心所欲地使用它。如果你想传递任何东西,只需使用一个对象作为参数,然后在构造函数中强制转换它。例如

public public FrmPartNumEntry(object value)
{
    InitializeComponent();
    int x = (int) value;
    this.ActiveControl = CboPartNum;
}

在两种形式都在运行的情况下。

假设您 form1 包含组合框,而 form2 需要它的数据然后

  1. 在 form1 中创建一个静态字段并将其公开。
  2. 在组合框中使用 textchanged 事件将值分配给静态字段
  3. 通过 form2 中的 form1.staticfieldname 访问。

推荐阅读