---短いバージョン:while (!checkReader.EndOfStream)
最初の後に毎回に到達すると、 と表示されますEndOfStream = true
。
---詳細: ユーザーは、Ajax AsyncFileUpload コントロールを使用してファイルをアップロードします。そのファイルを取得し、使用する csv の非常に具体的な形式であることを確認して、GridView に出力します。これはすべて、最初からうまく機能します。ファイルを取得して解析すると、うまく表示されます。
しかし、ユーザーのセッション中にいつでもこの同じコードを再度呼び出すと、StreamReader.EndOfStream = true
.
たとえば、ユーザーがファイルをアップロードし、それを GridView に吐き出します。おっとっと!ユーザーはヘッダーがあることに気付きます...元のファイルを再読み取りするために以下のメソッドを呼び出すイベントハンドラーで利用可能なチェックボックスがあります(セッション変数に保存されます)。ユーザーがボックスをチェックすると、イベントが発生し、メソッドが呼び出されますが、myEndOfStream
は true になりました。
using ()
そのフラグが変更されると思い、checkReader.DiscardBufferedData
以下の while ループの直後に追加しようとしましたが、どちらも影響を与えていないようです。
私は何を間違っていますか?
private void BuildDataFileGridView(bool hasHeaders)
{
//read import file from the session variable
Stream theStream = SessionImportFileUpload.PostedFile.InputStream;
theStream.Position = 0;
StringBuilder sb = new StringBuilder();
using (StreamReader checkReader = new StreamReader(theStream))
{
while (!checkReader.EndOfStream)
{
string line = checkReader.ReadLine();
while (line.EndsWith(","))
{
line = line.Substring(0, line.Length - 1);
}
sb.AppendLine(line);
}
}
using (TextReader reader = new StringReader(sb.ToString()))
{
//read the file in and shove it out for the client
using (CsvReader csv = new CsvReader(reader, hasHeaders, CsvReader.DefaultDelimiter))
{
sDataInputTable = new DataTable();
try
{
//Load the DataTable with csv values
sDataInputTable.Load(csv);
}
catch
{
DisplayPopupMessage("ERROR: A problem was encountered");
}
//Copy only the first 10 rows into a temp table for display.
DataTable displayDataTable = sDataInputTable.Rows.Cast<System.Data.DataRow>().Take(10).CopyToDataTable();
MyDataGridView.DataSource = displayDataTable;
MyDataGridView.DataBind();
}
}
}
編集: SessionImportFileUpload は、セッション変数として格納されている実際の Ajax AsyncFileUpload コントロールです (これは、以前の人がそれを使用する他のものを書いたときにすでに当てはまりました)。