c # передать значение из закрытой формы - PullRequest
3 голосов
/ 13 декабря 2011

У меня вопрос ООП.У меня есть 3 класса.Программа (основной класс), форма входа и форма1.программа запускает логин, который проверяет аутентификацию, если это успешно, form1 запускается, пока логин закрывается.Теперь у меня проблема в том, что если мне нужно передать значение переменной в мою форму1?
Причина в том, что я хочу использовать логин в качестве переменной, передать его в мою форму1, которая затем запускает соответствующий код длявыполнять определенные вещи.
В основном администратор имел бы полный доступ к элементам управления, но обычный пользователь имел бы ограниченный доступ.

вот мой код, исключая мою форму1 (не нужна, если кто-то не хочет ее видеть).

namespace RepSalesNetAnalysis
{
public partial class LoginForm : Form
{
    public bool letsGO = false;
    public LoginForm()
    {
        InitializeComponent();
    }

    private static DataTable LookupUser(string Username)
    {
        const string connStr = "Server=server;" +
                            "Database=dbname;" +
                            "uid=user;" +
                            "pwd=*****;" +
                            "Connect Timeout=120;";


        const string query = "Select password From dbo.UserTable (NOLOCK) Where UserName = @UserName";
        DataTable result = new DataTable();
        using (SqlConnection conn = new SqlConnection(connStr))
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand(query, conn))
            {
                cmd.Parameters.Add("@UserName", SqlDbType.VarChar).Value = Username;
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    result.Load(dr);
                }
            }
        }
        return result;
    }

    private void buttonLogin_Click(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(textUser.Text))
        {
            //Focus box before showing a message
            textUser.Focus();
            MessageBox.Show("Enter your username", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
            //Focus again afterwards, sometimes people double click message boxes and select another control accidentally
            textUser.Focus();
            textPass.Clear();
            return;
        }
        else if (string.IsNullOrEmpty(textPass.Text))
        {
            textPass.Focus();
            MessageBox.Show("Enter your password", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
            textPass.Focus();
            return;

        }
        //OK they enter a user and pass, lets see if they can authenticate
        using (DataTable dt = LookupUser(textUser.Text))
        {
            if (dt.Rows.Count == 0)
            {
                textUser.Focus();
                MessageBox.Show("Invalid username.", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                textUser.Focus();
                textUser.Clear();
                textPass.Clear();
                return;
            }
            else
            {
                string dbPassword = Convert.ToString(dt.Rows[0]["Password"]);
                string appPassword = Convert.ToString(textPass.Text); //we store the password as encrypted in the DB

                Console.WriteLine(string.Compare(dbPassword, appPassword));

                if (string.Compare(dbPassword, appPassword) == 0)
                {
                    DialogResult = DialogResult.OK;
                    this.Close();
                }
                else
                {
                    //You may want to use the same error message so they can't tell which field they got wrong
                    textPass.Focus();
                    MessageBox.Show("Invalid Password", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                    textPass.Focus();
                    textPass.Clear();
                    return;
                }
            }
        }
    }

    private void emailSteve_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        System.Diagnostics.Process.Start("mailto:stevesmith@shaftec.co.uk");
    }
}

и вот мой основной класс

namespace RepSalesNetAnalysis
{
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        //Application.Run(new LoginForm());

        LoginForm fLogin = new LoginForm();
        if (fLogin.ShowDialog() == DialogResult.OK)
        {
            Application.Run(new Form1());
        }
        else
        {
            Application.Exit();
        }
    }
}
}

Итак, чтобы подвести итог, мне нужно передать значение из моего класса входа в мой класс form1, чтобы я мог использовать условие внутри form1, чтобы ограничитьвзаимодействие с пользователем.

Ответы [ 4 ]

4 голосов
/ 13 декабря 2011

Вам необходимо предоставить свойство в LoginForm и передать его в Form1 в качестве параметра в конструкторе.Вот шаги, чтобы сделать это:

1) Добавьте следующий код в ваш LoginForm класс:

public string UserName
{
    get
    {
        return textUser.Text;
    }
}

2) Затем измените конструктор Form1, чтобы получить имя пользователя какпараметр:

private _userName;
public class Form1(string userName)
{
    _userName = userName;
}

3) Наконец, вам нужно только построить Form1 с нужным параметром:

namespace RepSalesNetAnalysis
{
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        //Application.Run(new LoginForm());

        LoginForm fLogin = new LoginForm();
        if (fLogin.ShowDialog() == DialogResult.OK)
        {
            Application.Run(new Form1(fLogin.UserName));
        }
        else
        {
            Application.Exit();
        }
    }
}

Надеюсь, это поможет.

3 голосов
/ 13 декабря 2011

Вы можете выставить его в свойстве и передать в конструкторе, что-то вроде этого

 LoginForm fLogin = new LoginForm();
 if (fLogin.ShowDialog() == DialogResult.OK)
 {
    Application.Run(new Form1(fLogin.Username));
 }

Я думаю, вам нужно оставить один конструктор без параметров, чтобы конструктор winforms работал, чтобы вы моглилибо попробуйте сохранить пустое значение, либо сначала создайте Form1, а затем передайте ему значение имени пользователя

1 голос
/ 13 декабря 2011

Вы можете передать требуемые значения следующим образом:

    LoginForm fLogin = new LoginForm();
    if (fLogin.ShowDialog() == DialogResult.OK)
    {
        Form1 frm = new Form1();
        frm.SomeValue = fLogin.txtUser.Text;
        Application.Run(frm);
    }
    else
    {
        Application.Exit();
    }
0 голосов
/ 13 декабря 2011

Создайте класс, который собирает данные из формы:

  class LoginFormResult {
       public string UserName { get; set; }
       // ....
       public DialogResult Result { get; set; }
  }

Теперь создайте метод в форме (я обычно использую статический) для выполнения формы,

 public static void Execute(LoginFormData data) {
     using (var f = new LoginForm()) {
         f.txtUserName.Text = data.UserName ?? "";
         // ...
         data.Result = f.ShowDialog();
         if (data.Result == DialogResult.OK) {
           data.UserName = f.txtUserName.Text;
           // ....
         }
     }
 }

Вы можете вызвать форму и обработать результат из вашего Main:

 public void Main() {
   // ...

   var loginData = new LoginData { UserName = "test" };
   LoginForm.Execute(loginData);
   if (loginData.Result == DialogResult.OK) {
      // ....
   }

   // ...
 }

Это скрывает реализацию от вызывающего метода, а также удаляет форму аккуратно и как можно раньше.Данные из формы доступны столько, сколько вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...