Прежде всего, ваш вопрос - беспорядок.Во-вторых, ваш код беспорядок.В любом случае, я объясню вам немного здесь.
Сначала от вас вопрос заголовка 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;
}
}