deepz
deepz

Reputation: 225

using combobox to display data to child form

I have two child forms. The first form (Employee) has all the textboxes and a button to open another child form called Search. The Search form has a combobox. After user selects data from combobox then the data from combobox will display in Employee form.

Employee Form:

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

Search Form:

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

I do not want another Employee form to open after user selects data from combobox. I want it to appear on the Employee Form that is already opened..

EDIT:

Employee Form

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();
        }
    }
}

Search Form

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;
        }
    }
}

Upvotes: 0

Views: 699

Answers (2)

King King
King King

Reputation: 63377

There are many many ways to achieve what you want, the most favorite I like is using some kind of event, yes event is one of the most interesting things in modern programming languages like C# (in .NET environment). However you can choose another solution simply like this:

//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 should be one element in your Employee form, you can show your search form using the method above and get the returned selected item value.

That's not a decent way in some cases, here I introduce you the way using event, you have to declare some event to notify the selecting from user and show the selected item on your 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;
  }
}

You can use traditional ways which pass values between classes... but I recommend using event (as the code above shows) or at least some kind of delegate. Programming in .NET environment requires you to make familiar with events and delegates much more...

Upvotes: 1

Ehsan
Ehsan

Reputation: 32721

on your parent form you should do this

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

where button1 is your button to open the search form. Form1 is your search form. and selectedRecord is your property that you set before closing the search form. I have assumed that it is a string though it can be any object.

Upvotes: 0

Related Questions