在我的應用程式中,我以編程方式生成了一堆 DataGridView。我可以向它添加/洗掉行并從中檢索所有資料并將資料復制到另一個 DataGrid 中。
例如當我創建它時
public void Example(TabControl tab)
for(int i=0;i<tab.TabCount;i )
{
tab.TabPages.Add("Panneau " tab.TabCount);
DataGridView panGridView = new DataGridView();
panGridView.Name = "panGridView_" tab.TabCount;
panGridView.Location = new System.Drawing.Point(0, 0);
panGridView.RowTemplate.Height = 24;
panGridView.Size = new System.Drawing.Size(1375, 458);
panGridView.Columns.Add("id", "id");
panGridView.Columns.Add("part_code", "part_code");
panGridView.Columns[0].Width = 100;
panGridView.Columns[1].Width = 150;
panGridView.Visible = true;
panIndex.Items.Add(tab.TabCount - 1);
tab.TabPages[tab.TabCount - 1].Controls.Add(panGridView);
}
現在,我想將方法??附加到此控制元件。我認為最好的方法是在初始化 Control 時附加它。例如,我會附加一個像這樣的方法
public void Action(DataGridViewCellMouseEventArgs e)
{
if(e.RowIndex==2)
{
MessageBox.Show("Hello");
}
我嘗試了很多,但無法弄清楚如何做到這一點。
謝謝
uj5u.com熱心網友回復:
在我看來,您想要一種特殊的 DataGridView。您需要一個帶有附加方法的 DataGridView。您已經了解到,每當您需要一個“類,與另一個類非常相似,但只有一點點不同”時,如果您不想公開所有方法,則需要創建一個派生類或進行組合基類的。
class DataGridViewWithAttachedMethod : DataGridView // TODO: invent proper name
{
...
}
class MySpecialDataGridView : UserControl
{
private DataGridView dgv1;
...
}
第一種方法的優點是您的類的用戶(= 代碼,而不是運算子)可以訪問所有 DataGridView 方法,因此使用起來非常靈活。缺點:它們可以訪問所有 DataGridView 方法,因此它們可能會弄亂您的 DataGridView。
您將使用派生還是組合取決于您的類需要做到多么愚蠢,換句話說:您想公開您不想被其他人使用的方法嗎?
我想將方法??附加到此控制元件。
這不是很清楚。你想給 DataGridView 一個額外的方法,總是一樣的嗎?或者你想動態附加一個方法:dgv1 有另一個附加的方法而不是 dgv2。
class DgvWithExtraMethod : ...
{
public void Action(DataGridViewCellMouseEventArgs e)
{
if(e.RowIndex==2)
{
MessageBox.Show("Hello");
}
}
}
此 dgv 的所有實體都將具有相同的額外方法。你所要做的就是創建這個類的一個物件,你就會擁有這個方法。
但是,如果要將不同的方法附加到類的實體,則需要一個包含此方法的屬性。
class DgvWithMethod : ...
{
public Action<DataGridViewCellMouseEventArgs> ExtraMethod {get; set;}
}
如果你想讓你的班級防呆,考慮用“無操作(NOP)”初始化方法
private static Action<DataGridViewCellMouseEventArgs> NOP = (e) => {};
public Action<DataGridViewCellMouseEventArgs> ExtraMethod {get; set;} = NOP;
用法:
DgvWithMethod dgv1 = new DgvWithMethod
{
ExtraMethod = (e) =>
{
if(e.RowIndex==2)
{
MessageBox.Show("Hello");
}
}
}
這是您問題的確切答案。但是,我認為您想知道的是:如果操作員單擊第 2 行,則我要執行方法F(),如果他單擊第 3 行,我要執行方法G()等
如果這是您想要的,請使用 Visual Studio 設計器在DataGridView.CellMouseClick上添加事件處理程式,或者如果您想重用此類(派生/組合)覆寫DataGridView.OnCellMouseClick。
private void DataGridView1_CellMouseClick(Object sender,
DataGridViewCellMouseEventArgs e)
{
// find out which column is clicked
switch (e.ColumnIndex)
{
case 0: // column Id clicked
this.ProcessColumnIdClick(e);
break;
case 1: // column Name clicked
this.ProcessColumnNameClick(e);
break;
...
但請注意:如果允許列重新排序,則應將 ColumnIndex 與每列的 DisplayIndex 進行比較。
if (e.ColumnIndex == this.columnId.DisplayIndex)
this.ProcessColumnIdClick(e);
else if (e.ColumnIndex == this.columnName.DisplayIndex)
...
uj5u.com熱心網友回復:
就像@CurleD 所說的那樣,您只需將您的方法訂閱到特定的 EventHandler。因此,將您的 Action 更改為:
private void panGridView_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if(e.RowIndex==2)
{
MessageBox.Show("Hello");
}
}
然后訂閱CellMouseClick事件:
panGridView.CellMouseClick = panGridView_CellMouseClick;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/318277.html
