gpt4 book ai didi

c# - 子窗体从多个父窗体获取属性

转载 作者:行者123 更新时间:2023-11-30 22:54:33 25 4
gpt4 key购买 nike

对于一个包含 DataGridView 的表单 (FrmItemSearch),我能否从两个父项(FrmMasterItemFrmMasterPackage)获取查询值并传递选择值到其父窗体?

我已经尝试让 FrmItemSearchFrmMasterItem 获取一些数据,它可以显示数据,但我想让 FrmItemSearch 获取数据也来自 FrmMasterPackage,所以我只需要一个带有 DataGridView 的 Form 来执行所有搜索操作。

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

最佳答案

使用 Interface 的示例, 定义一个契约(Contract),将一个类(此处为表单)与另一个类相关联。

由于您有多个类(Forms)需要使用另一个类(您的 Search Form)来使用通用属性和方法执行相同的任务,worker类(Search Form)不需要知道哪个类实例化了它,它只需要依赖接口(interface)实现并使用公共(public)属性和方法来读取它需要的值并写入它的结果.

创建一个定义创建契约的属性和方法的接口(interface)(所有相关类都需要了解和依赖的内容):

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

string GetSomeOtherValue();
}

所有要调用SearchForm的Form都必须实现ISearch接口(interface):

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 事件中,设置了接口(interface)定义的属性,初始化并显示了 Search 表单,设置了 Search 表格电流 Owner :

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

Search 表单关闭时,Search 表单设置的值(此处为 ReturnValue属性值)被读取以确定搜索结果。
当然,您还可以返回任何内容或设置多个属性:例如,您可以返回一个 DataTable。

搜索表单使用接口(interface)定义当前调用者表单:

ISearch myOwner = null;

然后验证当前所有者是否实现此接口(interface):它必须知道它是否可以依赖契约(Contract) 定义的属性和方法。

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

如果当前所有者没有实现受信任的接口(interface),则会抛出异常:Search Form 无法读取和写入所需的值。
如果是,则初始化自己从已知属性读取值(当然需要一些常规检查,即 null 或与类型相关的检查)。
关闭时,它使用特定属性(ReturnValue,此处为)设置结果:

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

搜索 表单:

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 not the right type!");
}
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
myOwner.ReturnValue = true;
base.OnFormClosing(e);
}
}

关于c# - 子窗体从多个父窗体获取属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56162968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com