【问题标题】:using combobox to display data to child form使用组合框将数据显示到子窗体
【发布时间】:2013-07-08 09:37:11
【问题描述】:

我有两个子窗体。第一个表单 (Employee) 包含所有文本框和一个用于打开另一个名为 Search 的子表单的按钮。搜索表单有一个组合框。用户从组合框中选择数据后,组合框中的数据将以员工形式显示。

员工表格:

public string s;
protected override void OnShown(EventArgs e)
{
    txtName.Text = s;
    base.OnShown(e);
}

搜索表格:

private void cbFind_SelectedValueChanged(object sender, EventArgs e)
{
    if (cbFind.SelectedItem != null)
    {
        emp em = new emp();
        em.s = cbFind.SelectedItem.ToString();
        em.ShowDialog();
    }
}

我不希望在用户从组合框中选择数据后打开另一个员工表单。我希望它出现在已经打开的员工表单上..

编辑:

员工表格

namespace Master
{
    public partial class Employee : Form
    {
        public Employee()
        {
            InitializeComponent();
            searchForm.ItemSelected += ItemSelected;
        }

        private SearchForm searchForm = new SearchForm();

        private void ItemSelected(object sender, ItemSelectedEventArgs e)
        {
            txtName.Text = e.SelectedItem.ToString();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SearchForm searchForm = new SearchForm();
            searchForm.Show();
        }
    }
}

搜索表单

namespace Master
{
    public partial class SearchForm : Form
    {
        public SearchForm()
        {
            InitializeComponent();
        }

        private void SearchForm_Load(object sender, EventArgs e)
        {

        }

        private void cbFind_SelectedValueChanged(object sender, EventArgs e)
        {
            if (cbFind.SelectedItem != null)
            {
               if(ItemSelected != null) 
                   ItemSelected(this, new ItemSelectedEventArgs(cbFind.SelectedItem));
            }
        }

        public delegate void ItemSelectedEventHandler(object sender, ItemSelectedEventArgs e);

        public event ItemSelectedEventHandler ItemSelected;
    }

    public class ItemSelectedEventArgs : EventArgs
    {
        public object SelectedItem { get; set; }
        public ItemSelectedEventArgs(object selectedItem)
        {
            SelectedItem = selectedItem;
        }
    }
}

【问题讨论】:

  • 您应该将搜索表单作为对话框打开,如果用户选择记录,您应该设置 DialogResult = ok。然后从父窗体中,您可以检查用户是否按下了确定,您可以调用子窗体的属性来获取所选记录。如果您需要这方面的示例,请告诉我。
  • 我该如何实现?是的,我需要看一个例子。
  • 在答案中发布

标签: c# winforms


【解决方案1】:

有很多方法可以实现你想要的,我最喜欢的是使用某种event,是的event是现代编程语言(如C#)中最有趣的东西之一(在.NET环境中)。但是,您可以像这样选择其他解决方案:

//in your Search form
public string ShowSearch(){
    if(ShowDialog() == DialogResult.OK){
       return cbFind.SelectedItem == null ? "" : cbFind.SelectedItem.ToString();
    }
    return "";
}
//returning "" means some kind of cancel action which will result no search performed.

Search form应该是你Employee form中的一个元素,你可以使用上面的方法显示你的搜索表单并获取返回的选中项值。

在某些情况下这不是一个体面的方式,这里我向您介绍使用事件的方式,您必须声明一些事件来通知用户选择并在您的员工表单上显示选定的项目:

//your Employee form
public class Employee : Form {
    public Employee(){
       InitializeComponent();
       searchForm.ItemSelected += ItemSelected;
    }
    //Search form
    private SearchForm searchForm = new SearchForm();
    //your ItemSelected handler
    private void ItemSelected(object sender, ItemSelectedEventArgs e){
       txtName.Text = e.SelectedItem.ToString();
    }
}
//your Search form
public class SearchForm : Form {
  public SearchForm(){
     InitializeComponent();
  }
  //handler for your combobox SelectedValueChanged event.
  private void cbFind_SelectedValueChanged(object sender, EventArgs e)
  {
    if (cbFind.SelectedItem != null)
    {
       if(ItemSelected != null) ItemSelected(this, new ItemSelectedEventArgs(cbFind.SelectedItem);
    }
  }
  public delegate void ItemSelectedEventHandler(object sender, ItemSelectedEventArgs e);
  //your own event
  public event ItemSelectedEventHandler ItemSelected;
}
public class ItemSelectedEventArgs : EventArgs {
  public object SelectedItem {get;set;}
  public ItemSelectedEventArgs(object selectedItem){
     SelectedItem = selectedItem;
  }
}

您可以使用在类之间传递值的传统方式...但我建议使用事件(如上面的代码所示)或至少某种delegate。在 .NET 环境中编程需要您更多地熟悉事件和委托...

【讨论】:

  • 我试过你的第二种方法,但它没有在员工表单中显示任何数据。
  • 我没有其他东西可以解释我的解决方案,也许这有点难以解释,但只是像我一样显示代码。
  • @deepz 你的这个代码是错误的private void button1_Click(object sender, EventArgs e) { SearchForm searchForm = new SearchForm(); searchForm.Show(); } 你已经在Employee form constructor 中创建了searchForm 并在那里注册了ItemSelected 事件,在button1_Click 你只需要@ 987654333@它不重新创建它,如果你想在button1_Click创建一个新实例,你必须在创建后注册事件ItemSelected
  • 好吧,修好了。现在工作。谢谢:)
【解决方案2】:

在你的父表单上你应该这样做

     private void button1_Click(object sender, EventArgs e)
    {
        Form1 searchForm = new Form1();
        if (searchForm.ShowDialog() == DialogResult.OK)
        {
            string selectedRecord =  searchForm.SelectedRecord;
        }
    }

其中 button1 是您打开搜索表单的按钮。 Form1 是您的搜索表单。 selectedRecord 是您在关闭搜索表单之前设置的属性。我假设它是一个字符串,尽管它可以是任何对象。

【讨论】:

  • 我对父表单进行了更改。但如我的搜索表单所示,它将打开一个新的员工表单。我希望它显示在已经打开的现有员工表单中。
  • 它正在打开一个新表单,因为您正在设置 emp em = new emp();不需要这个。只需设置一个公共属性,例如 SelectedRecord =cbFind.SelectedItem.ToString();然后从你已经打开的表单中你应该做 searchForm.SelectedRecord
  • 查看我的编辑。我确实像你说的那样,现在我的文本框中没有显示任何内容
  • 在你的 btnFind_Click 你应该这样做 textbox1.Text = Selectedrecord;在此行字符串 selectedRecord = search.SelectedRecord;请注意 textbox1 是您的文本框的名称
  • private void btnFind_Click(object sender, EventArgs e) { Search search = new Search(); if (search.ShowDialog() == DialogResult.OK) { string selectedRecord = search.SelectedRecord; textBox1.Text = selectedRecord; } }
猜你喜欢
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 2020-07-15
  • 2010-10-16
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 2019-06-28
相关资源
最近更新 更多