01/10/2018, 09:18

Tạo sự kiện delegate User Control cho 1 Form

Mình đang làm 1 bài tập về User Control trên Window Form.

Form 1 có nút Login mình click vào nút đó thì gọi Form 2 lên là form login. Ở form 2 chỉ có 1 user control mình thiết kế trước . Ở đây mình không hiểu lắm về nguyên lý hoạt động của Form cha.
Ví dụ Control của mình là login, khi mình hoàn thành gõ vào username, password làm sao mình lấy Form cha mà cái user control nó đang nằm trên để close form ở đây là form 2 .

Đây là code của mình

User Control Login

public partial class LoginControl : UserControl
    {
        public delegate void Login(string username, string password);
        public event Login LoginEvent;

        public LoginControl()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            string username = txtUsername.Text.Trim();
            string password = txtPassword.Text.Trim();

            if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))
            {
                MessageBox.Show("Wrong username or password", "Error",
                MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return;
            }

            if (LoginEvent != null)
            {
                LoginEvent(username, password);
                 // Mình muốn lấy form cha để nhấn nút cancel thì close form ( Form 2 )
            }
            else
            {
                 // Mình muốn lấy form cha để nhấn nút cancel thì close form ( Form 2 )
            }
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            // Mình muốn lấy form cha để nhấn nút cancel thì close form ( Form 2 )
        }

Đây là hình form đã gắn user control và form 1

Tao Không Ngu. viết 11:22 ngày 01/10/2018

Hi WIGU0606.
Có nhiều cách.
1 Bạn gọi thàng chứa thàng control login ra.
2 Truyền fỏn vào cho thằng control.
3 Dùng ViewMângẻ.

Tuy nhiên theo ý kiến của mình thì bạn là login trên một form riêng luôn.

bphvcg viết 11:30 ngày 01/10/2018

Bt làm với user control bạn ơi. Nếu làm form riêng thì mình hiểu cách làm

Trần Ngọc Khoa viết 11:33 ngày 01/10/2018

Trong User Control sẽ có một Button Login như của bạn. Nếu bạn Nhấn Login, User Control sẽ kiểm tra text bạn nhập với CSDL. Lúc này sự kiện Login xảy ra. Sự kiện Login xả ra thì method được uỷ thác (thường định nghĩa trong Form) sẽ được thực thi.
Bổ sung tí:
Method được uỷ thác sẽ thực thi cái gì?
Theo mình nghĩ thì nó sẽ chuyển từ màn hình đăng nhập sang màn hình làm việc. Hoặc Show nội dụng Database…

bphvcg viết 11:19 ngày 01/10/2018

Mình làm thế này bạn xem có ok không nhé

User Control Login Form

public delegate void Login(string username, string password);
        public event Login LoginEvent;

        public LoginControl()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            string username = txtUsername.Text.Trim();
            string password = txtPassword.Text.Trim();

            if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))
            {
                MessageBox.Show("Wrong username or password", "Error",
                MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return;
            }

            if (LoginEvent != null)
            {
                LoginEvent(username, password);
                ParentForm.Close();
            }
            else
            {
                ParentForm.Close();
            }
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            ParentForm.Close();
        }

Đây là Form 2 là form cha của cái Login Control mình kéo thả vào

public partial class loginForm : Form
    {
        string user = "", pass = "";

        public loginForm()
        {
            InitializeComponent();
        }

        private void loginControl1_Load(object sender, EventArgs e)
        {
            loginControl1.Parent = this;
            loginControl1.LoginEvent += loginControl1_LoginEvent;
        }

        private void loginControl1_LoginEvent(string username, string password)
        {
            user = username;
            pass = password;
        }

        public string GetUSer()
        {
            return user;
        }

        public string GetPass()
        {
            return pass;
        }
    }

Đây là form 1 khi nhấn nút login thì show form 2 và get thông tin để in ra

public partial class Form1 : Form
    {
        string username, password;

        public Form1()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            loginForm fm2 = new loginForm();
            fm2.ShowDialog();
            username = fm2.GetUSer();
            password = fm2.GetPass();
            lbShow.Text += "\n" + username + "\n" + password;
        }
    }
Trần Ngọc Khoa viết 11:24 ngày 01/10/2018

Bạn cho mình xin cái yêu cầu của đề bài được không? Tại vì mình chỉ góp ý theo suy nghĩ chứ không biết yêu cầu thực tế như thế nào cả

bphvcg viết 11:19 ngày 01/10/2018

Tạo form 1 là form có button login. Nhấn button thì show form 2 ra là form đăng nhập có chứa user control ( tự thiết kế có 2 textbox 2 button như hình mình post ) . khi nhấn login nếu textbox có kí tự thì close form 2 và truyền username và pasword qua form 1 để show ra.

Trần Ngọc Khoa viết 11:31 ngày 01/10/2018
public partial class LoginControl: UserControl
    {
        public delegate void LoginHandler(object sender, EventArgs e);
        public event LoginHandler Login;
        {
            get { return success; }
        }
       
        public LoginControl()
        {
            InitializeComponent(); 
        }
        
        private void LoginButton_Click(object sender, EventArgs e)
        {
           //Kiểm tra điều kiện ở đây
           if(........)
            {
                 //Login thành công
                  if (Login != null)
                     {
                         Login(this, new EventArgs());
                     }
            }
            
        }
    }

Đây là user control của mình làm.
Trong Forrm2, vì nó hiện ra khi nhận nút ở form1, sau đó gửi dữ liệu qua form1 nên constructor của nó nên truyền vào tham số là Form1 object. Form2 cũng có một member là Form1 parent;

public Form2(Form1 owner){
}

Bạn khai báo hàm uỷ thác cho sự kiện Login. Hàm này có nhiệm vụ là thay đổi biến username và password của owner, sau đó gọi hàm show dữ liệu Form1 và đóng Form2.

Nguyễn Thị Thành viết 11:23 ngày 01/10/2018

mình có thể hỏi 1 chút không? mình đang có 1 bài tập thế này: từ Form1 gửi dữ liệu qua 1 UC control và UC control đó nằm trong form2. Bình thường mình gửi dữ liệu từ form qua fom thì được nhưng khi gửi dữ liệu qua UC control thì lại không đc. giúp mình với, mình chưa hiểu vì sao lại không đc?

Trần Ngọc Khoa viết 11:29 ngày 01/10/2018

Bạn gửi dữ liệu bằng cách nào? Tầm vực của biến chứa dữ liệu có được truy cập từ các lớp tương ứng không?

Nguyễn Thị Thành viết 11:29 ngày 01/10/2018

Mình thiết kế 2 Form như thế trên.
Form1 có 1 button: bntOK, và 1 textbox: txtchuyendulieu
Form2 : có 1 textbox : txtnhansolieu. Và 1 UC control có tên là UCtest.

Code Form1:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace truyendulieu
{
public partial class Formchuyendulieu : DevExpress.XtraEditors.XtraForm
{
public Formchuyendulieu()
{
InitializeComponent();
}

    private void btnOK_Click(object sender, EventArgs e)
    {
        Formnhandulieu frmnhandulieu = new Formnhandulieu();
        frmnhandulieu.nhandulieu = txtchuyendulieu.Text;
        
        uCtest1.Message = txtchuyendulieu.Text;
        Formnhandulieu frmnhan = new Formnhandulieu();
        frmnhandulieu.Show();
    }        
    private void btnthoat_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }
                       
         
      
}

}

Code Form2:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.XtraEditors;

namespace truyendulieu
{
public partial class Formnhandulieu : DevExpress.XtraEditors.XtraForm
{
public Formnhandulieu()
{
InitializeComponent();
}
public string nhandulieu
{
get { return txtnhandulieu.Text; }

        set { txtnhandulieu.Text=value;  }

    }

    
}

}

Code UCtest:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace truyendulieu
{
public partial class UCtest : UserControl
{

    public UCtest()
    {
        InitializeComponent();        
    }
    public string Message
    {
        get { return label1.Text; }

        set { label1.Text=value;  }
   
    }

    
}

}
/////////////////////////////////////////////////////
Vấn đề của mình ở chỗ, hiện tại khi chạy chương trình, trên Form1 gửi dữ liệu đi cho Form2 và UC control nằm trên Form1 đã đc, nhưng mà UC Control nằm trên Form2 lại không nhận được dữ liệu. Có thể giúp mình đoạn Code để cho cái UC nằm trên Form2 cũng nhận được dữ liệu khi mà Form1 gửi đi giống như Form2 và UC control nằm trên Form1 đã nhận không? Cám ơn nhiều…
PS: nếu như làm theo cách lấy chuỗi String từ form2 xuống UC control trên Form2 thì mình đã làm đc, nhưng mình muốn cách làm mà lấy trực tiếp từ Form1 chuyền qua UCtest nằm trên Form2.

Trần Ngọc Khoa viết 11:21 ngày 01/10/2018

Bạn thử cái này nhé

     private void btnOK_Click(object sender, EventArgs e)
        {
            Formnhandulieu frmnhandulieu = new Formnhandulieu();
            frmnhandulieu.nhandulieu = txtchuyendulieu.Text;
            frmnhandulieu.uCtest1.Message = txtchuyendulieu.Text;
            uCtest1.Message = txtchuyendulieu.Text;
            Formnhandulieu frmnhan = new Formnhandulieu();
            frmnhandulieu.Show();
        }
Nguyễn Thị Thành viết 11:23 ngày 01/10/2018

sau khi mình thêm đoạn Code: frmnhandulieu.uCtest2.Message = txtchuyendulieu.Text; (với uCtest2 là UC control nằm trên form2) thì báo lỗi như dưới đây, và vẫn không chạy đc. Hjc

Error 1 ‘truyendulieu.Formnhandulieu.uCtest2’ is inaccessible due to its protection level D:\vidutruyendulieu\truyendulieu\truyendulieu\Formchuyendulieu.cs 25 27 truyendulieu

Nguyễn Thị Thành viết 11:29 ngày 01/10/2018

Cám ơn nhé, mình đã làm được rồi.

Trần Ngọc Khoa viết 11:21 ngày 01/10/2018

Chắc là tầm vực lúc đó của uCtest2 không phải là public phải không bạn.

Nguyễn Thị Thành viết 11:19 ngày 01/10/2018

đúng rồi, mình để nó là private, nên nó báo lỗi, khi chỉnh lại là public thì nó OK luôn

Trần Ngọc Khoa viết 11:23 ngày 01/10/2018

Bạn cho mình hỏi tí là cái User Control này bạn học trong môn nào vậy

Nguyễn Thị Thành viết 11:28 ngày 01/10/2018

Mình tự đọc tài liệu rồi chắp vá thôi, hjc, nên làm không theo hệ thống nào cả.Code buồn cười lắm phải không? Đừng cười nhé

Trần Ngọc Khoa viết 11:25 ngày 01/10/2018

Mình chỉ thấy là cái User Control này có liên quan đến môn Lập trình trên môi trường windows thôi. Không biết bạn đã học môn này chưa? Chứ đâu có gì buồn cười đâu

Bài liên quan
0