2012-07-19 65 views
6

Tôi có hai Biểu mẫu, biểu mẫu chính của tôi là Biểu mẫu 1 và biểu mẫu phụ của tôi được hiển thị theo yêu cầu dưới dạng hộp thoại là Biểu mẫu 2. Bây giờ nếu tôi gọi Form2 nó hiển thị luôn ở góc trên bên trái trên màn hình của tôi. Lần đầu tiên tôi nghĩ rằng hình dạng của tôi không có ở tất cả, nhưng sau đó tôi thấy nó treo ở góc trên màn hình. Tôi muốn hiển thị biểu mẫu của tôi ở vị trí chuột hiện tại nơi người dùng nhấp vào menu ngữ cảnh để hiển thị hộp thoại phương thức. Tôi đã thử những thứ khác nhau và tìm kiếm các mẫu mã. Nhưng tôi thấy không có gì ngoài hàng ngàn mã khác nhau về cách để có được vị trí chuột thực tế theo những cách khác nhau mà tôi đã biết. Nhưng vị trí này là luôn luôn liên quan đến màn hình, hình thức chính, kiểm soát hoặc bất cứ bối cảnh hiện tại là gì. Ở đây mã của tôi (vị trí máy tính để bàn mà tôi cũng đã cố gắng không làm việc và trung tâm trung tâm-to-màn hình hình thức duy nhất, vì vậy tôi rời khỏi tài sản để Windows.Default.Position):C# cách hiển thị biểu mẫu tại vị trí chuột cụ thể trên màn hình?

 Form2 frm2 = new Form2(); 
     frm2.textBox1.Text = listView1.ToString(); 
     frm2.textBox1.Tag = RenameFile; 
     DialogResult dlgres=frm2.ShowDialog(this); 
     frm2.SetDesktopLocation(Cursor.Position.X, Cursor.Position.Y); 

Trả lời

9

Vấn đề của bạn là cuộc gọi đầu tiên của bạn: frm2.ShowDialog(this); và sau đó gọi frm2.SetDesktopLocation mà trên thực tế chỉ được gọi sau khi biểu mẫu (frm2) đã đóng.

ShowDialog là cuộc gọi chặn - có nghĩa là nó chỉ trả lại khi biểu mẫu bạn đang gọi ShowDialog khi đóng. Vì vậy, bạn sẽ cần một cách tiếp cận khác để thiết lập vị trí biểu mẫu.

Có lẽ cách dễ nhất để thực hiện điều đó là tạo một hàm tạo thứ hai trên Form2 của bạn (mà bạn muốn định vị), lấy hai tham số cho tọa độ X và Y.

public class Form2 
{ 

    // add this code after the class' default constructor 

    private int desiredStartLocationX; 
    private int desiredStartLocationY; 

    public Form2(int x, int y) 
      : this() 
    { 
     // here store the value for x & y into instance variables 
     this.desiredStartLocationX = x; 
     this.desiredStartLocationY = y; 

     Load += new EventHandler(Form2_Load); 
    } 

    private void Form2_Load(object sender, System.EventArgs e) 
    { 
     this.SetDesktopLocation(desiredStartLocationX, desiredStartLocationY); 
    } 

Sau đó, khi bạn tạo ra các hình thức để hiển thị nó, sử dụng constructor này thay vì một mặc định:

Form2 frm2 = new Form2(Cursor.Position.X, Cursor.Position.Y); 
frm2.textBox1.Text = listView1.ToString(); 
frm2.textBox1.Tag = RenameFile; 
DialogResult dlgres=frm2.ShowDialog(this); 

Bạn cũng có thể thử sử dụng this.Move(...)' instead of 'this.SetDesktopLocation trong xử lý Load.

+0

Bạn đã thử đề xuất của mình chưa? Bạn đã triển khai hàm tạo đã sửa đổi chưa và nó không hoạt động? –

+0

@feedwall - Tôi rất vui vì nó làm việc ra cho bạn (và cảm ơn cho upvote & chấp nhận) –

+0

StartPosition cần phải được thiết lập để hướng dẫn sử dụng – ehh

2

Bạn cần phải gọi SetDesktopLocation trước khi phương pháp ShowDialog(), như vậy:

using(Form2 frm2 = new Form2()) 
{ 
    frm2.textBox1.Text = listView1.ToString(); 
    frm2.textBox1.Tag = RenameFile; 
    frm2.SetDesktopLocation(Cursor.Position.X, Cursor.Position.Y); 

    DialogResult dlgres=frm2.ShowDialog(this); 
} 

Sử dụng các chính khách sử dụng, nó recomanded. Chúc may mắn;)

Các vấn đề liên quan