【发布时间】:2023-03-14 22:39:02
【问题描述】:
我正在尝试在我的 DataGridView 中搜索数据以仅在文本框中显示带有选定文本的行,但是当我键入它时会完全删除数据。我在 MSDN 上拿了我的代码示例:https://code.msdn.microsoft.com/windowsdesktop/Search-Data-From-Database-f2cb5d53
这是我的代码:
private void txtbox_TextChanged(object sender, EventArgs e)
{
DataView DV = new DataView(datatable);
DV.RowFilter = string.Format("Name LIKE '%{0}%'", txtbox.Text);
dataGridView1.DataSource = DV;
}
任何帮助将不胜感激,谢谢。
注意:我没有使用 SQL,只使用 C#
整体:命名空间 CsvFileTest { 公共部分类Form1:表格 { 私有常量 int MaxColumns = 64; 受保护的字符串文件名; protected bool 已修改;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
InitializeGrid();
ClearFile();
}
private void newToolStripMenuItem_Click(object sender, EventArgs e)
{
if (SaveIfModified())
ClearFile();
}
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
if (SaveIfModified())
{
if (openFileDialog1.ShowDialog(this) == DialogResult.OK)
ReadFile(openFileDialog1.FileName);
}
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
if (FileName != null)
WriteFile(FileName);
else
saveAsToolStripMenuItem_Click(sender, e);
}
private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
{
saveFileDialog1.FileName = FileName;
if (saveFileDialog1.ShowDialog(this) == DialogResult.OK)
WriteFile(saveFileDialog1.FileName);
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
if (SaveIfModified())
Close();
}
/// <summary>
/// //////////////////////////////////////////////
/// </summary>
private void InitializeGrid()
{
for (int i = 1; i <= MaxColumns; i++)
{
dataGridView1.Columns.Add(
String.Format("Column{0}", i),
String.Format("Column {0}", i));
}
}
private void ClearFile()
{
dataGridView1.Rows.Clear();
FileName = null;
Modified = false;
}
private bool ReadFile(string filename)
{
Cursor = Cursors.WaitCursor;
try
{
//dataGridView1.Rows.Clear();
List<string> columns = new List<string>();
using (var reader = new CsvFileReader(filename))
{
while (reader.ReadRow(columns))
{
dataGridView1.Rows.Add(columns.ToArray());
}
}
FileName = filename;
Modified = false;
return true;
}
catch (Exception ex)
{
MessageBox.Show(String.Format("Error reading from {0}.\r\n\r\n{1}", filename, ex.Message));
}
finally
{
Cursor = Cursors.Default;
}
return false;
}
private bool WriteFile(string filename)
{
Cursor = Cursors.WaitCursor;
try
{
// Like Excel, we'll get the highest column number used,
// and then write out that many columns for every row
int numColumns = GetMaxColumnUsed();
using (var writer = new CsvFileWriter(filename))
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (!row.IsNewRow)
{
List<string> columns = new List<string>();
for (int col = 0; col < numColumns; col++)
columns.Add((string)row.Cells[col].Value ?? String.Empty);
writer.WriteRow(columns);
}
}
}
FileName = filename;
Modified = false;
return true;
}
catch (Exception ex)
{
MessageBox.Show(String.Format("Error writing to {0}.\r\n\r\n{1}", filename, ex.Message));
}
finally
{
Cursor = Cursors.Default;
}
return false;
}
// Determines the maximum column number used in the grid
private int GetMaxColumnUsed()
{
int maxColumnUsed = 0;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (!row.IsNewRow)
{
for (int col = row.Cells.Count - 1; col >= 0; col--)
{
if (row.Cells[col].Value != null)
{
if (maxColumnUsed < (col + 1))
maxColumnUsed = (col + 1);
continue;
}
}
}
}
return maxColumnUsed;
}
private bool SaveIfModified()
{
if (!Modified)
return true;
DialogResult result = MessageBox.Show("The current file has changed. Save changes?", "Save Changes", MessageBoxButtons.YesNoCancel);
if (result == DialogResult.Yes)
{
if (FileName != null)
{
return WriteFile(FileName);
}
else
{
saveFileDialog1.FileName = FileName;
if (saveFileDialog1.ShowDialog(this) == DialogResult.OK)
return WriteFile(saveFileDialog1.FileName);
return false;
}
}
else if (result == DialogResult.No)
{
return true;
}
else // DialogResult.Cancel
{
return false;
}
}
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
Modified = true;
}
protected static DataView dv = null;//declared at the Class Level
protected static DataTable dtSearch = null;
public static DataTable dtCrossTab { get; set; }
private void button1_Click(object sender, EventArgs e)
{
if (txtbox.Text.Length > 0)
{
dtSearch = dtCrossTab;//this is the original datatable
dv = new DataView(dtSearch);//assigning the dtSearch to dv object
dv.RowFilter = "NAME 4 LIKE '%" + txtbox.Text.ToUpper() + "%'";
}
else
{
dtSearch = null;
dv = null;
}
}
【问题讨论】:
-
4在过滤器中做什么? -
没什么,我试着写了 Colomn 4 但它没有用,因为我没有使用 SQL 我不认为这条线会工作,但我不知道如何让它在没有 SQL 的情况下工作(我真的不能使用 SQL(LINQ))
-
好的。你检查过滤器字符串了吗?不过,它在代码中看起来确实不错。同样的代码在这里也可以工作。列类型是字符串?应用了任何格式?
标签: c# datagridview