我希望用户能够在DataGridView中(DGV)一栏来搜索数量。 该DGV可以容纳多条记录。 每个记录有一个项目编号。 所以,我希望用户能够搜索在列项目编号项目数量。 我的列有:专案编号(不可见); 图像(无HEADERTEXT); 项目编号; 项目名; 公司; 联系。
这里是我的代码:
private void btnSearch_Click(object sender, EventArgs e)
{
string searchValue = textBox1.Text;
int rowIndex = -1;
dgvProjects.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
try
{
foreach (DataGridViewRow row in dgvProjects.Rows)
{
if (row.Cells[row.Index].Value.ToString().Equals(searchValue))
{
rowIndex = row.Index;
dgvProjects.Rows[row.Index].Selected = true;
break;
}
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
问题1:它迄今为止功能:通过用户在TextBox1中的项目编号。 当他/她点击该按钮,代码搜索这个字符串的行,当发现项目数,该行被选中。 它工作正常,但只有一次。 当我要搜索的其他项目数量,没有任何反应。
问题2:我认为这是可以以更好的方式来完成,通过仅列项目名称搜索值。 但如何我应该这样做是否正确?
我用来搜索代码来自这个答案
Answer 1:
为什么你正在使用row.Cells [row.Index。 您需要指定要搜索列的索引(问题2)。 例如,你需要改变row.Cells [row.Index]到row.Cells [2],其中2是你列的索引:
private void btnSearch_Click(object sender, EventArgs e)
{
string searchValue = textBox1.Text;
dgvProjects.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
try
{
foreach (DataGridViewRow row in dgvProjects.Rows)
{
if (row.Cells[2].Value.ToString().Equals(searchValue))
{
row.Selected = true;
break;
}
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
Answer 2:
这是更好也是你的逻辑在另一种方法在另一个类分开,或者可能。
此方法将帮助您retreive其中文本被发现的DataGridViewCell对象。
/// <summary>
/// Check if a given text exists in the given DataGridView at a given column index
/// </summary>
/// <param name="searchText"></param>
/// <param name="dataGridView"></param>
/// <param name="columnIndex"></param>
/// <returns>The cell in which the searchText was found</returns>
private DataGridViewCell GetCellWhereTextExistsInGridView(string searchText, DataGridView dataGridView, int columnIndex)
{
DataGridViewCell cellWhereTextIsMet = null;
// For every row in the grid (obviously)
foreach (DataGridViewRow row in dataGridView.Rows)
{
// I did not test this case, but cell.Value is an object, and objects can be null
// So check if the cell is null before using .ToString()
if (row.Cells[columnIndex].Value != null && searchText == row.Cells[columnIndex].Value.ToString())
{
// the searchText is equals to the text in this cell.
cellWhereTextIsMet = row.Cells[columnIndex];
break;
}
}
return cellWhereTextIsMet;
}
private void button_click(object sender, EventArgs e)
{
DataGridViewCell cell = GetCellWhereTextExistsInGridView(textBox1.Text, myGridView, 2);
if (cell != null)
{
// Value exists in the grid
// you can do extra stuff on the cell
cell.Style = new DataGridViewCellStyle { ForeColor = Color.Red };
}
else
{
// Value does not exist in the grid
}
}
Answer 3:
你为什么不建立一个DataTable
第一然后将其分配到DataGridView
为DataSource
:
DataTable table4DataSource=new DataTable();
table4DataSource.Columns.Add("col00");
table4DataSource.Columns.Add("col01");
table4DataSource.Columns.Add("col02");
...
(添加的行,手动地,在一个圆圈或经由DataReader
从数据库表)(分配数据源)
dtGrdViewGrid.DataSource = table4DataSource;
然后使用:
(dtGrdViewGrid.DataSource as DataTable).DefaultView.RowFilter = "col00 = '" + textBoxSearch.Text+ "'";
dtGrdViewGrid.Refresh();
你甚至可以把这段代码的内textbox_textchange
事件和您的过滤值将显示为你写的。
Answer 4:
// This is the exact code for search facility in datagridview.
private void buttonSearch_Click(object sender, EventArgs e)
{
string searchValue=textBoxSearch.Text;
int rowIndex = 1; //this one is depending on the position of cell or column
//string first_row_data=dataGridView1.Rows[0].Cells[0].Value.ToString() ;
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
try
{
bool valueResulet = true;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Cells[rowIndex].Value.ToString().Equals(searchValue))
{
rowIndex = row.Index;
dataGridView1.Rows[rowIndex].Selected = true;
rowIndex++;
valueResulet = false;
}
}
if (valueResulet != false)
{
MessageBox.Show("Record is not avalable for this Name"+textBoxSearch.Text,"Not Found");
return;
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
Answer 5:
直接从过滤数据DataTable
或Dataset
:
"MyTable".DefaultView.RowFilter = "<DataTable Field> LIKE '%" + textBox1.Text + "%'";
this.dataGridView1.DataSource = "MyTable".DefaultView;
使用事件这段代码KeyUp
的Textbox
,将“MyTable的”为你的表名或数据集,取代对您想要使搜索领域。
Answer 6:
“MyTable的” .DefaultView.RowFilter = “LIKE '%” + textBox1.Text + “%'”; this.dataGridView1.DataSource = “MyTable的” .DefaultView;
怎么样的关系数据库的连接和数据表? 我应该如何设置默认视图是否正确?
我使用此代码来获取数据了:
con = new System.Data.SqlServerCe.SqlCeConnection();
con.ConnectionString = "Data Source=C:\\Users\\mhadj\\Documents\\Visual Studio 2015\\Projects\\data_base_test_2\\Sample.sdf";
con.Open();
DataTable dt = new DataTable();
adapt = new System.Data.SqlServerCe.SqlCeDataAdapter("select * from tbl_Record", con);
adapt.Fill(dt);
dataGridView1.DataSource = dt;
con.Close();
文章来源: Search for value in DataGridView in a column