Как отправить выбранные данные в datagridview в текстовое поле в отдельной форме? - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть сетевое представление, в котором хранится информация о пользователях, и оно связано с базой данных ms-access.Я хочу, чтобы они могли выбрать строку в представлении данных, а затем открыть форму «Изменить профиль» с данными из этой строки, уже вставленными в текстовые поля.Прямо сейчас я должен вставить ID # в первую строку, чтобы он мог прочитать, на какую строку я ссылаюсь.Вот что у меня есть.

{
        ConnectToDataBase();
        OleDbCommand command = new OleDbCommand();
        command.Connection = connection;
        while (reader.Read())
        {
            textBox1.Text = 
            textBox2.Text = reader.GetValue(2).ToString();
            textBox3.Text = reader.GetValue(3).ToString();
            textBox4.Text = reader.GetValue(4).ToString();
            textBox5.Text = reader.GetValue(5).ToString();
            comboBox1.Text = reader.GetValue(6).ToString();
            comboBox2.Text = reader.GetValue(7).ToString();
            textBox6.Text = reader.GetValue(8).ToString();
        }
        //string query = "update Profiles set [PROFILE NAME]='" + textBox1.Text + "', [LOGIN EMAIL]='" + textBox2.Text + "', [PASSWORD]='" + textBox3.Text + "', [FULL NAME]='" + textBox4.Text + "', [CARD NUMBER]='" + textBox5.Text + "', [EXP MONTH]='" + comboBox1.Text + "', [EXP YEAR]='" + comboBox2.Text + "', CVV='" + textBox6.Text + "' where  ID='" + Convert.ToInt32(textBox7.Text) + "'";
        string query = "update Profiles set [PROFILE NAME]= @Profile, [LOGIN EMAIL]= @Email, [PASSWORD]= @Pass, [FULL NAME]= @Name, [CARD NUMBER]= @Card, [EXP MONTH]= @EXPM, [EXP YEAR]= @EXPY, CVV= @CVV where ID = @Id";
        command.Parameters.AddWithValue("@Profile", textBox1.Text);
        command.Parameters.AddWithValue("@Email", textBox2.Text);
        command.Parameters.AddWithValue("@Pass", textBox3.Text);
        command.Parameters.AddWithValue("@Name", textBox4.Text);
        command.Parameters.AddWithValue("@Card", textBox5.Text);
        command.Parameters.AddWithValue("@EXPM", comboBox1.Text);
        command.Parameters.AddWithValue("@EXPY", comboBox2.Text);
        command.Parameters.AddWithValue("@CVV", textBox6.Text);
        command.Parameters.AddWithValue("@ID", textBox7.Text);
        command.CommandText = query;
        command.ExecuteNonQuery();
        RefreshDBConnection();
        connection.Close();
        MessageBox.Show("Profile Edited");
        this.Close();

Спасибо!

1 Ответ

0 голосов
/ 18 ноября 2018

Прежде всего, ваш вопрос - беспорядок.Во-вторых, ваш код беспорядок.В любом случае, я объясню вам немного здесь.

Сначала от вас вопрос заголовка How to send selected data on datagridview to a textbox in a seperate form? Я думаю, у вас есть datagirdview в одной форме, и вы хотите отправить данные выбранной строки в другую форму.

Вот два случая:

Первый случай, если вы отправляете данные при открытии новой формы.Таким образом, пользователь выбирает строку, затем нажимает кнопку и открывает другую форму, которая должна иметь данные из этой строки.

Для этого вы будете использовать формы constructor

public partial class SecondForm : Form
{
    public SecondForm(int userId, string userName)
    {
        InitializeComponents();

        MessageBox.Show("User ID you passed is " + userId + " and it's name is " + userName);
    }
}

Сейчасмы изменили наш конструктор так, чтобы он требовал значений, которые мы называем этой формой из первой (с datagridview), например:

private void Button1_Click(object sender, EventArgs e)
{
    //This is event of button click

    if(yourDataGridView.SelectedRows.Count < 0)
    {
        MessageBox.Show("You must select one user!");
        return;
    }

    DataGridViewRow row = yourDataGridView.SelectedRows[0]; // We will select first selected row. If there are multiple selected rows we will select just first one

    int uid = Convert.ToInt32(row.Cells["ColumnThatContainsUserId"].Value);
    string uname = row.Cells["ColumnThatContainsUserName"].Value.ToString();

    //I am using `using` since `Form` is disposable class and instead of later doing sf.Dispose() i use `using`. This way we take care of perfomance
    using(SecondForm sf = new SecondForm(uid, uname))
    {
        sf.ShowDialog();
    }
}

Теперь я передал его как int, string, но на самом деле я бы создал собственный классдля пользователя и передайте его.

Если вы уже открыли первую форму (одну с dataGridView), а также открыли вторую, вы можете сделать это следующим образом.

Сначала нам нужно сделатьпублично доступная функция во второй форме, которая обновит ваши текстовые поля.

public partial class SecondForm : Form
{
    public SecondForm()
    {
        // All your code
    }

    public void SwitchUser(int userId, string userName)
    {
        textbox1.Text = userId.ToString();
        textbox2.Text = userName;
    }
}

Теперь у нас есть функция, которая будет обновлять наши текстовые поля с переданными значениями.Теперь нам нужно получить доступ к этой функции из первой формы

public partial class FirstForm : Form
{
    private SecondForm sf; //Declaring it so it is accessible from whole first form class

    private int lastSelectedRow = -1; //Will use it later

    public FirstForm()
    {
        //All your code
    }

    private void dataGridView_CellClick(object sender, EventArgs e)
    {
        //This event fires every time user click cell

        if(sf == null)
        {
            //This means our second form has not been initialized so maybe show message to user and return or open it up

            //First solution
            sf = new SecondForm();
            sf.Show();

            //Second solution
            MessageBox.Show("Second form is not initialized!");
            return;
        }

        //I would here check if(sf.Visible) and if it is not i would sf.Show();

        //We check if same row has been selected. If it does then we do nothing
        if(dataGridView.SelectedRows[0].Index == lastSelectedRow)
            return;

        int uid = Convert.ToInt32(row.Cells["ColumnThatContainsUserId"].Value);
        string uname = row.Cells["ColumnThatContainsUserName"].Value.ToString();

       sf.SwitchUser(uid, uname); //Accessing through global variable

       lastSelectedRow = dataGridView.SelectedRows[0].Index;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...