1 дочерняя форма, получающая собственность от нескольких родительских форм C # - PullRequest
2 голосов
/ 16 мая 2019

могу ли я получить значение запроса от 2 родительского элемента (FrmMasterItem) и (FrmMasterPackage) для 1 формы просмотра данных (FrmItemSearch) и передать выбранное значение его родительской форме. Я новичок в C # :)

i ужепопробовал FrmItemSearch, получая данные из FrmMasterItem, и он может показать данные, но я хочу также получить данные из FrmMasterPackage, поэтому мне нужна только 1 форма просмотра сетки

//this is my MasterItem Form
public partial class FrmMasterItem : Form
{
      public string myQuery { get; set; }
      public FrmMasterItem()
      {
            InitializeComponent();
      }
      public void SearchItemCode_Click(object sender, EventArgs e)
      {
            this.myQuery = "select * from InItemMst";

            FrmItemSearch fcd = new FrmItemSearch(this);
            fcd.ShowDialog();
      }
}

 //this is my MasterPackage Form
  public partial class FrmMasterPackage : Form 
  {
      public string sQuery { get; set; }
      public FrmMasterPackage()
      {
           InitializeComponent();
      }
      public void SearchItemCode_Click(object sender, EventArgs e)
      {
            this.sQuery = "select * from InPackagehdr";
            //i want to get this query on FrmSearchItem

      }
  }  

//this is my Item Search Form
public partial class FrmItemSearch : Form
{
      private FrmMasterItem f_mb;
      public FrmItemSearch(FrmMasterItem fmb)
      {
            f_mb = fmb;
            InitializeComponent();
      }

      private void FrmItemSearch_Load(object sender, EventArgs e)
      {
            MySqlConnection conn = DBUtils.GetDbConnection();
            conn.Open();

            string query = this.f_mb.myQuery;//this is only MasterItem Data i want to make some selection for MasterPackage here so the Gridview can View MasterPackage data using sQuery Value from FrmMasterPackage

            MySqlDataAdapter adapter = new MySqlDataAdapter(query, conn);
            DataTable dt = new DataTable();
            adapter.Fill(dt);
            BindingSource bSource = new BindingSource();
            bSource.DataSource = dt;
            dataGridView1.DataSource = bSource;
      }
}

Ответы [ 3 ]

1 голос
/ 16 мая 2019

просто объявите вашу переменную myQuery, как показано ниже в главной форме

public static string myQuery

, и затем вы можете получить доступ к этой переменной в любой форме, используя объект мастера

0 голосов
/ 16 мая 2019

Пример использования интерфейса для определения контракта , который связывает один класс (здесь форму) с другим.

Поскольку у вас есть несколько классов (форм), которым нужно использовать другой класс (форму Search) для выполнения одной и той же задачи с использованием общих свойств методов, класс worker (Search Form) не нужно знать, какой класс его создал, просто нужно полагаться на реализацию интерфейса и использовать общие свойства и методы для чтения значений, которые ему нужны, и записи результатов.

Создайте интерфейс, который определяет свойства и методы, которые создают контракт (то, что все участвующие классы должны знать и полагаться):

internal interface ISearch
{
    string Query { get; }
    int Other { get; }
    bool ReturnValue { get; set; }

    string GetSomeOtherValue();
}

Все формы, которые хотят вызвать форму Search, должны реализовывать интерфейс ISearch:

public class FrmMasterItem : Form, ISearch
{
    public FrmMasterItem() => InitializeComponent();

    // Interface implementation
    public string Query { get; private set; }
    public int Other { get ; private set; }
    public bool ReturnValue { get; set; }

    public string GetSomeOtherValue()
    {
        return "SomeValue";
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Query = "SELECT someField FROM someTable";
        this.Other = 100;
        var search = new SearchForm();
        search.ShowDialog(this);
        if (this.ReturnValue)
            Console.WriteLine("All Good");
    }
}

Здесь при событии Button.Click устанавливаются свойства, определенные интерфейсом, форма Search инициализируется и отображается, устанавливая Search текущий ток формы Владелец :

var search = new SearchForm();
search.ShowDialog(this);

Когда форма Search закрыта, для определения результата поиска читается значение, установленное формой Search (здесь значение ReturnValue propeprty).
Конечно, вы можете вернуть что-либо еще или установить более одного свойства: например, вы можете вернуть DataTable.

Форма поиска определяет текущую форму вызывающего абонента с использованием интерфейса:

ISearch myOwner = null;

Затем проверяет, реализует ли данный владелец этот интерфейс: он должен знать, может ли он полагаться на свойства и методы, определенные в контракте .

Type type = this.Owner.GetType();
if (typeof(ISearch).IsAssignableFrom(type)) {
    // (...)
    myOwner = (ISearch)this.Owner;
}

Если текущий владелец не реализует доверенный интерфейс, возникает исключение: форма Search не может прочитать и записать необходимые значения.
Если это так, инициализируется сам, считывая значения из известных свойств (конечно, необходимы некоторые обычные проверки, то есть null или связанные с типом).
При закрытии он устанавливает результат, используя определенное свойство (ReturnValue, здесь):

myOwner.ReturnValue = true;
base.OnFormClosing(e);

Форма Search:

public partial class SearchForm : Form
{
    ISearch myOwner = null;
    string currentQuery = string.Empty;
    string otherValues = string.Empty;

    public SearchForm() => InitializeComponent();

    protected override void OnHandleCreated(EventArgs e)
    {
        base.OnHandleCreated(e);
        Type type = this.Owner.GetType();
        if (typeof(ISearch).IsAssignableFrom(type))
        {
            myOwner = (ISearch)this.Owner;
            this.currentQuery = myOwner.Query;
            this.otherValues = myOwner.GetSomeOtherValue();
            Console.WriteLine(this.currentQuery);
            Console.WriteLine(myOwner.Other);
            Console.WriteLine(this.otherValues);
        }
        else
        {
            throw new NotSupportedException("My Owner is the not the right type!");
        }
    }
    protected override void OnFormClosing(FormClosingEventArgs e)
    {
        myOwner.ReturnValue = true;
        base.OnFormClosing(e);
    }
}
0 голосов
/ 16 мая 2019

Могу ли я также добавить, что добавление кода DAL (уровень доступа к данным) или BLL (уровень бизнес-логики) в ваши формы считается плохой практикой? Я предлагаю создавать каталоги и классы для такого кода.

Я предлагаю следующее:

public partial class FrmItemSearch : Form
{
      private FrmMasterItem f_mb;
      public FrmItemSearch(FrmMasterItem fmb)
      {
            f_mb = fmb;
            InitializeComponent();
      }

      private void FrmItemSearch_Load(object sender, EventArgs e)
      {
            ataGridView1.DataSource = DAL.GetSourceFromDatabase(DAL.query);
      }
}

public static class DAL
{
    public static string query = "MyQuery"

    public static BindingSource GetSourceFromDatabase(string query)
    {
        MySqlConnection conn = DBUtils.GetDbConnection();
        conn.Open();
        MySqlDataAdapter adapter = new MySqlDataAdapter(query, conn);
        DataTable dt = new DataTable();
        adapter.Fill(dt);
        BindingSource bSource = new BindingSource();
        bSource.DataSource = dt;
        return dt;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...