datagridviewを検索可能にしようとしていますが、コツをつかめないようです。私は解決策への道をグーグルで調べてみましたが、次のことがわかりました。
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Cells[0].Value.ToString().ToLower().Contains(searchTextBox.Text.ToLower()) && row.Cells[0] != null)
{
row.Visible = true;
}
else
{
row.Visible = false;
}
}
上記のコードはフォームのボタンにリンクされており、そこに表示するものは多くありません。テキストボックスに文字列を入力してボタンをクリックすると、次の例外が発生します。
通貨マネージャーのポジションに関連付けられた行を非表示にすることはできません。
この例外に対処する方法がわかりません。さまざまな変更を試みましたが、何も役に立ちませんでした。
あなたにアイデアを与えるために、これは私のフォームのコードです(私は1つのフォームしか持っていません):
namespace IntegratorReader
{
public partial class start : Form
{
DataTable dt = new DataTable();
public start()
{
InitializeComponent();
}
private void bOpenFileDialog_Click(object sender, EventArgs e)
{
OpenFileDialog theDialog = new OpenFileDialog();
theDialog.Title = "Open Text File";
theDialog.Filter = "TXT files|*.txt";
theDialog.InitialDirectory = @"C:\";
if (theDialog.ShowDialog() == DialogResult.OK)
{
try
{
if ((theDialog.OpenFile()) != null)
{
string fullPath = theDialog.FileName;
string fileName = theDialog.SafeFileName;
MessageBox.Show(fullPath);
fillGridView(fullPath);
}
}
catch (Exception ex)
{
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
}
}
}
private void fillGridView (string path)
{
var regex = new Regex("\\\"(.*?)\\\"");
System.IO.StreamReader file = new System.IO.StreamReader(path);
string[] columnnames = file.ReadLine().Split(',');
foreach (string c in columnnames)
{
dt.Columns.Add(c);
}
string newline;
while ((newline = file.ReadLine()) != null)
{
newline = regex.Replace(newline, m => m.Value.Replace(',', ' '));
DataRow dr = dt.NewRow();
string[] values = newline.Split(',');
for (int i = 0; i < values.Length; i++)
{
string v = values[i];
v = v.Replace("\"", "");
dr[i] = v;
}
dt.Rows.Add(dr);
}
file.Close();
dataGridView1.DataSource = dt;
}
private void searchButton_Click(object sender, EventArgs e)
{
try
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Cells[0].Value.ToString().ToLower().Contains(searchTextBox.Text.ToLower()) && row.Cells[0] != null)
{
row.Visible = true;
}
else
{
row.Visible = false;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
短い例:
多くの行を含む.txtファイルを開きますが、最初の行を取得し、それを基に列を作成します。次に、行を読み取り、「、」スプリッターに基づいて列に配置します。これはある種のCSVリーダーで実行できたと思いますが、これを機能させるにはこれが必要です。これは作業に関連するものであるため、正確な.txtファイルを提供することはできませんが、行と列が増えるだけで、通常は次のようになります。
「顧客ID」、「顧客名」
「1」、「ボブ」
「2」、「デニス」
「3」、「リチャード」
「4」、「フェルナンド」
あなたは一般的な考えを得る...
さて、私の質問は、データグリッドビューで検索する方法について完全に間違っているのか、それとも私が監視しているのは単に小さな問題なのかということです。datagridviewで検索するためのより良い方法はありますか?はいの場合、どのようにですか?
参考までに、フォームは次のようになります。
コードには2つの問題があります。1-空の行(最後の行)のチェックを実行せず、行を非表示にしている間、currencyManagerを一時停止しません。
修正するには、searchButton_Clickコードを次のように置き換えます。
private void searchButton_Click(object sender, EventArgs e)
{
try
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[dataGridView1.DataSource];
currencyManager1.SuspendBinding();
if (row.IsNewRow)
continue;
if (row.Cells[0].Value.ToString().ToLower().Contains(searchTextBox.Text.ToLower()) )
{
row.Visible = true;
}
else
{
row.Visible = false;
}
currencyManager1.ResumeBinding();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
**回答の更新**
別のオプションは、行を削除または非表示にする前に、現在のセルをnullに設定することです。これは、エラーが「
行は通貨マネージャーに関連付けられています
"。
if(dataGridView1.CurrentCell!=null)
dataGridView1.CurrentCell = null;
row.Visible = true;//row.Visible = false
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加