如何在TextBoxes中获取所选行的dataGridView的所有列值
How to get selected row's all column values of dataGridView in TextBoxes
我正在处理 windows 表格申请。
它包含两个表单 MainForm - Test 和 childForm - Search
搜索表单有 dataGridView control.It 包含 SrNo、TypeNo、TestEngineer 和 Date 等列。
测试表单包含文本框 tb_SerialNo、tb_TypeNo、tb_TestEngineer、datTimePicker for date.
我的主要问题是当我 select 来自 datagridview 的行时,我想要文本框 tb_SerialNo 中该行的 SrNo 列值。所有人都一样。
我写了下面的代码。但它只给我 tb_SerialNo 中的 SrNo 值。但我没有在各自的文本框中获得 TypeNo、TestEngineer 和日期值。我无法找到我所缺少的东西。请帮我解决这个问题。提前致谢。
mainForm - 测试代码
private void SearchToolStripMenuItem_Click(object sender, EventArgs e)
{
SearchTest Search = new SearchTest(dt);
Search.ShowDialog();
dt.DefaultView.RowFilter = "";
tb_SerialNo.Text = Search.SerialNo;
Search.typeNo = tb_TypeNo.Text;
Search.TestEngineer = tb_TestEngineer.Text;
Search.Date = dateTimePicker1.Text;
}
ChildForm -SearTest 代码:
public partial class SearchTest : Form
{
public SearchTest(DataTable TestData)
{
InitializeComponent();
dataGridView1.DataSource = TestData;
this.dataGridView1.Sort(this.dataGridView1.Columns["SrNo"], ListSortDirection.Ascending);
}
private void btn_Search_Click(object sender, EventArgs e)
{
string str = dateTimePicker1.Text;
string str1 = dateTimePicker2.Text;
DateTime date = DateTime.ParseExact(str, "MM/dd/yyyy", CultureInfo.GetCultureInfo("en-GB"));
DateTime date1 = DateTime.ParseExact(str1, "MM/dd/yyyy", CultureInfo.GetCultureInfo("en-GB"));
string dtFilter = string.Format("[Date] >= '{0} ' AND [Date] <= '{1} '", date.ToString("MM/dd/yyyy"), date1.ToString("MM/dd/yyyy"));
(dataGridView1.DataSource as DataTable).DefaultView.RowFilter = dtFilter;
}
private void tb_SearchSrNo_TextChanged(object sender, EventArgs e)
{
try
{
(dataGridView1.DataSource as DataTable).DefaultView.RowFilter = String.IsNullOrEmpty(tb_SearchSrNo.Text) ?
"SrNo IS NOT NULL" :
String.Format("SrNo LIKE '{0}%' OR SrNo LIKE '{1}%' OR SrNo LIKE '{2}%'", tb_SearchSrNo.Text, tb_SearchSrNo.Text, tb_SearchSrNo.Text);
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void SearchTest_Load(object sender, EventArgs e)
{
groupBox1.Enabled = false;
groupBox3.Enabled = false;
cb_Filter.MouseWheel += new MouseEventHandler(cb_Filter_MouseWheel);
}
private void cb_Filter_SelectedIndexChanged(object sender, EventArgs e)
{
if (cb_Filter.SelectedIndex == 0)
{
groupBox1.Enabled = true;
}
else
{
groupBox3.Enabled = true;
}
}
void cb_Filter_MouseWheel(object sender, MouseEventArgs e)
{
((HandledMouseEventArgs)e).Handled = true;
}
private string SrNo;
private string TypeNo;
private string TestEng;
private string date;
public string SerialNo
{
get { return SrNo; }
set { SrNo = value; }
}
public string typeNo
{
get { return TypeNo; }
set { TypeNo = value; }
}
public string TestEngineer
{
get { return TestEng; }
set { TestEng = value; }
}
public string Date
{
get { return date; }
set { date = value; }
}
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
SrNo = dataGridView1.CurrentRow.Cells["SrNo"].Value.ToString();
TypeNo = dataGridView1.CurrentRow.Cells["TypeNo"].Value.ToString();
TestEng = dataGridView1.CurrentRow.Cells["TestEngineer"].Value.ToString();
date = dataGridView1.CurrentRow.Cells["Date"].Value.ToString();
}
}
尝试改用 SelectedRow。
SelectedRow 和 CurrentRow 的区别:
- CurrentRow 是鼠标光标所在的位置,由系统选中。
- SelectedRow 是在datagridview 中选择的行,并且始终由用户选择。
这是一个示例代码:
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
if (dataGridView1.SelectedCells.Count > 0)
{
int index = dataGridView1.SelectedCells[0].RowIndex;
DataGridViewRow selectedRow = dataGridView1.Rows[index];
SrNo = selectedRow.Cells["SrNo"].Value.ToString();
TypeNo = selectedRowCells["TypeNo"].Value.ToString();
TestEng = selectedRowCells["TestEngineer"].Value.ToString();
date = selectedRowCells["Date"].Value.ToString();
}
}
您可以将 属性 定义更改为如下内容:
public string SomeProperty
{
get
{
string value = null;
if(BindingContext[dataGridView1.DataSource].Current !=null)
{
var r = ((DataRowView)BindingContext[dataGridView1.DataSource].Current).Row;
value = r.Field<string>("SomeDataColumn");
}
return value;
}
}
这样,SomeProperty
将始终 return 来自活动行的 SomeDataColumn
的值。
我得到了答案,我的问题得到了解决。我在 mainForm - 测试代码中发现了我的错误。我以错误的方式为 typeNo、TestEngineer 和日期使用了属性,序列号除外。这就是为什么我没有在各自的文本框中获得值。
更正后的 MainForm - 测试代码:
private void SearchToolStripMenuItem_Click(object sender, EventArgs e)
{
SearchTest Search = new SearchTest(dt);
Search.ShowDialog();
dt.DefaultView.RowFilter = "";
tb_SerialNo.Text = Search.SerialNo;
tb_TypeNo.Text = Search.typeNo;
tb_TestEngineer.Text = Search.TestEngineer;
dateTimePicker1.Text = Search.Date;
}
无需对搜索表单进行任何更改。
我正在处理 windows 表格申请。
它包含两个表单 MainForm - Test 和 childForm - Search
搜索表单有 dataGridView control.It 包含 SrNo、TypeNo、TestEngineer 和 Date 等列。 测试表单包含文本框 tb_SerialNo、tb_TypeNo、tb_TestEngineer、datTimePicker for date.
我的主要问题是当我 select 来自 datagridview 的行时,我想要文本框 tb_SerialNo 中该行的 SrNo 列值。所有人都一样。
我写了下面的代码。但它只给我 tb_SerialNo 中的 SrNo 值。但我没有在各自的文本框中获得 TypeNo、TestEngineer 和日期值。我无法找到我所缺少的东西。请帮我解决这个问题。提前致谢。
mainForm - 测试代码
private void SearchToolStripMenuItem_Click(object sender, EventArgs e)
{
SearchTest Search = new SearchTest(dt);
Search.ShowDialog();
dt.DefaultView.RowFilter = "";
tb_SerialNo.Text = Search.SerialNo;
Search.typeNo = tb_TypeNo.Text;
Search.TestEngineer = tb_TestEngineer.Text;
Search.Date = dateTimePicker1.Text;
}
ChildForm -SearTest 代码:
public partial class SearchTest : Form
{
public SearchTest(DataTable TestData)
{
InitializeComponent();
dataGridView1.DataSource = TestData;
this.dataGridView1.Sort(this.dataGridView1.Columns["SrNo"], ListSortDirection.Ascending);
}
private void btn_Search_Click(object sender, EventArgs e)
{
string str = dateTimePicker1.Text;
string str1 = dateTimePicker2.Text;
DateTime date = DateTime.ParseExact(str, "MM/dd/yyyy", CultureInfo.GetCultureInfo("en-GB"));
DateTime date1 = DateTime.ParseExact(str1, "MM/dd/yyyy", CultureInfo.GetCultureInfo("en-GB"));
string dtFilter = string.Format("[Date] >= '{0} ' AND [Date] <= '{1} '", date.ToString("MM/dd/yyyy"), date1.ToString("MM/dd/yyyy"));
(dataGridView1.DataSource as DataTable).DefaultView.RowFilter = dtFilter;
}
private void tb_SearchSrNo_TextChanged(object sender, EventArgs e)
{
try
{
(dataGridView1.DataSource as DataTable).DefaultView.RowFilter = String.IsNullOrEmpty(tb_SearchSrNo.Text) ?
"SrNo IS NOT NULL" :
String.Format("SrNo LIKE '{0}%' OR SrNo LIKE '{1}%' OR SrNo LIKE '{2}%'", tb_SearchSrNo.Text, tb_SearchSrNo.Text, tb_SearchSrNo.Text);
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void SearchTest_Load(object sender, EventArgs e)
{
groupBox1.Enabled = false;
groupBox3.Enabled = false;
cb_Filter.MouseWheel += new MouseEventHandler(cb_Filter_MouseWheel);
}
private void cb_Filter_SelectedIndexChanged(object sender, EventArgs e)
{
if (cb_Filter.SelectedIndex == 0)
{
groupBox1.Enabled = true;
}
else
{
groupBox3.Enabled = true;
}
}
void cb_Filter_MouseWheel(object sender, MouseEventArgs e)
{
((HandledMouseEventArgs)e).Handled = true;
}
private string SrNo;
private string TypeNo;
private string TestEng;
private string date;
public string SerialNo
{
get { return SrNo; }
set { SrNo = value; }
}
public string typeNo
{
get { return TypeNo; }
set { TypeNo = value; }
}
public string TestEngineer
{
get { return TestEng; }
set { TestEng = value; }
}
public string Date
{
get { return date; }
set { date = value; }
}
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
SrNo = dataGridView1.CurrentRow.Cells["SrNo"].Value.ToString();
TypeNo = dataGridView1.CurrentRow.Cells["TypeNo"].Value.ToString();
TestEng = dataGridView1.CurrentRow.Cells["TestEngineer"].Value.ToString();
date = dataGridView1.CurrentRow.Cells["Date"].Value.ToString();
}
}
尝试改用 SelectedRow。
SelectedRow 和 CurrentRow 的区别:
- CurrentRow 是鼠标光标所在的位置,由系统选中。
- SelectedRow 是在datagridview 中选择的行,并且始终由用户选择。
这是一个示例代码:
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
if (dataGridView1.SelectedCells.Count > 0)
{
int index = dataGridView1.SelectedCells[0].RowIndex;
DataGridViewRow selectedRow = dataGridView1.Rows[index];
SrNo = selectedRow.Cells["SrNo"].Value.ToString();
TypeNo = selectedRowCells["TypeNo"].Value.ToString();
TestEng = selectedRowCells["TestEngineer"].Value.ToString();
date = selectedRowCells["Date"].Value.ToString();
}
}
您可以将 属性 定义更改为如下内容:
public string SomeProperty
{
get
{
string value = null;
if(BindingContext[dataGridView1.DataSource].Current !=null)
{
var r = ((DataRowView)BindingContext[dataGridView1.DataSource].Current).Row;
value = r.Field<string>("SomeDataColumn");
}
return value;
}
}
这样,SomeProperty
将始终 return 来自活动行的 SomeDataColumn
的值。
我得到了答案,我的问题得到了解决。我在 mainForm - 测试代码中发现了我的错误。我以错误的方式为 typeNo、TestEngineer 和日期使用了属性,序列号除外。这就是为什么我没有在各自的文本框中获得值。
更正后的 MainForm - 测试代码:
private void SearchToolStripMenuItem_Click(object sender, EventArgs e)
{
SearchTest Search = new SearchTest(dt);
Search.ShowDialog();
dt.DefaultView.RowFilter = "";
tb_SerialNo.Text = Search.SerialNo;
tb_TypeNo.Text = Search.typeNo;
tb_TestEngineer.Text = Search.TestEngineer;
dateTimePicker1.Text = Search.Date;
}
无需对搜索表单进行任何更改。