私は ListView から継承している MyClass という単一のクラスを持っています...基本的にはリストビューであり、フォームなどで使用できます..このクラスのドラッグアンドドロップイベントをオーバーライドしたので、2 つ置くとフォーム上のこれらのコントロールの 1 つから別の項目にドラッグすると、問題なく実行されます。私の問題は DoubleClick にあります。このクラスに DoubleClick() を実装するにはどうすればよいですか? 後でフォームにこれらのコントロールを 2 つ配置し、そのうちの 1 つの項目をダブルクリックすると、もう一方のコントロールに移動します...それは可能ですか?
質問する
702 次
3 に答える
2
どうやったら実現できるのか気になったのでやってみました。新しい Windows フォーム プロジェクトを作成し、myClass:ListView を作成しました (以下のコードを参照)。次に、フォームにコントロールを 2 つ追加し、姉妹プロパティを使用してそれらを結び付けました (実際にはプロパティとして記述しませんでした)。
myClass1 に 1 つのアイテムを追加し、myClass2 に 2 つのアイテムを追加しました。それらのいずれかをダブルクリックすると、他のリストビューに移動します。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
myClass1.sister = myClass2;
myClass2.sister = myClass1;
}
}
public class myClass : ListView
{
//This is where we will store the information about the sister Control
private myClass _sister;
//**EDIT** I changed sister into a property and now it is selectable
//from the designer.
public myClass sister { get { return _sister; } set { _sister = value; } }
public myClass()
{
}
//here is where we override the OnDoubleCLick Event
protected override void OnDoubleClick(EventArgs e)
{
//Make sure this control has a sister
if (sister != null)
{
//add a temporary storage location for the selected Item
ListViewItem item = this.SelectedItems[0];
//Remove the Item from the clicked List
this.Items.Remove(item);
//Add the Item to the sister List
((myClass)sister).Items.Add(item);
}
base.OnDoubleClick(e);
}
}
于 2012-05-22T17:32:35.347 に答える
1
これを試しましたか?:
private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
{
ListView source = sender as ListView;
ListViewItem item = source.HitTest(e.Location).Item;
if (item != null)
{
MessageBox.Show("Item " + item.Text + " was double clicked on " + source.Name );
}
}
送信者は、どのリストビューがダブルクリックされたかを通知します。ドラッグ アンド ドロップを既に実装しているので、同じ方法で転送を実装できるはずです。
于 2012-05-22T17:27:05.543 に答える
1
Parent
これは、コントロールにアクセスして、次のように移動することで可能になりControls
ます。
var allMyClasses = this.Parent.Controls.OfType<MyClass>().ToList();
int index = allMyClasses.IndexOf(this);
MyClass target = null;
if (index == allMyClasses.Count - 1)
{
target = allMyClasses[0];
}
else if (allMyClasses.Count != 0)
{
target = allMyClasses[index + 1];
}
正確なコードについては 100% 確信が持てませんが (テストしていません)、一般的な手法で十分に機能するはずです。もちろん、null チェックParent
が必要であり、これらの詳細を MouseDoubleClick に貼り付ける必要がありますが、問題なく動作するはずです。
于 2012-05-22T17:27:21.600 に答える