2013-08-20 3 views
0

Я не хочу связывать его, пока он не зациклится. То, что у меня есть, - это файл csv, загруженный в gridview. Я хотел бы пропустить его до его привязки. Любой совет замечательный.Я пытаюсь выяснить, как пройти через мой datatable. Любое предложение?

protected void btnUpload_Click(object sender, EventArgs e) 
    { 
     if (FileUpload1.HasFile) 
     try 
     { 
      FileUpload1.SaveAs(Server.MapPath("") + 
       FileUpload1.FileName); 
      Label1.Text = "File name: " + 
       FileUpload1.PostedFile.FileName + "<br>" + 
       FileUpload1.PostedFile.ContentLength + " kb<br>" + 
       "Content type: " + 
       FileUpload1.PostedFile.ContentType + "<br><b>Uploaded Successfully"; 
     } 
     catch (Exception ex) 
     { 
      Label1.Text = "ERROR: " + ex.Message.ToString(); 
     } 
    else 
    { 
     Label1.Text = "You have not specified a file."; 
    } 



     CSVReader reader = new CSVReader(FileUpload1.PostedFile.InputStream); 
     string[] headers = reader.GetCSVLine(); 
     DataTable dt = new DataTable(); 

     foreach (string strHeader in headers) 
      dt.Columns.Add(strHeader); 
     string[] data; 
     while ((data = reader.GetCSVLine()) != null) 
      dt.Rows.Add(data); 
     csvReaderGv.DataSource = dt; 

     csvReaderGv.DataBind(); 


      } 



    } 
+0

Что мешает вам выполнять 'foreach (строка DataRow в dt.Rows) ...'? –

+0

Я помещаю это перед csvReaderGv.DataSource = dt; csvReaderGv.DataBind(); или после. Его замешательство, которое мешает мне. – Jay

+0

Да, потому что ваше требование: _ «Я бы хотел пропустить его до того, как он привязан» _. Этот вопрос немного странный, не так ли? –

ответ

0

Попробуйте это:

// Loop through each row in the data table 
foreach (DataRow row in dt.Rows) 
{ 
    // Loop through each column in row 
    for (int i = 0; i <= dt.Columns.Count - 1; i++) 
    { 
     // Do whatever you want here for each cell 
    } 
} 

Вот что ваш код должен выглядеть следующим образом:

protected void btnUpload_Click(object sender, EventArgs e) 
{ 
    if (FileUpload1.HasFile) 
    { 
     try 
     { 
      FileUpload1.SaveAs(Server.MapPath("") + FileUpload1.FileName); 
      Label1.Text = "File name: " + 
      FileUpload1.PostedFile.FileName + "<br>" + 
      FileUpload1.PostedFile.ContentLength + " kb<br>" + "Content type: " + 
      FileUpload1.PostedFile.ContentType + "<br><b>Uploaded Successfully"; 
     } 
     catch (Exception ex) 
     { 
      Label1.Text = "ERROR: " + ex.Message.ToString(); 
     } 
    } 
    else 
    { 
     Label1.Text = "You have not specified a file."; 
    } 

    CSVReader reader = new CSVReader(FileUpload1.PostedFile.InputStream); 
    string[] headers = reader.GetCSVLine(); 
    DataTable dt = new DataTable(); 

    foreach (string strHeader in headers) 
    { 
     dt.Columns.Add(strHeader); 
    } 

    string[] data; 
    while ((data = reader.GetCSVLine()) != null) 
    { 
     dt.Rows.Add(data); 
    } 

    // Loop through each row in the data table 
    foreach (DataRow row in dt.Rows) 
    { 
     // Loop through each column in row 
     for (int i = 0; i <= dt.Columns.Count - 1; i++) 
     { 
      // Do whatever you want here for each cell 
     } 
    } 

    csvReaderGv.DataSource = dt; 
    csvReaderGv.DataBind(); 
} 
+0

Я помещаю его перед или после привязки, где поставить foreach - это то, что меня смущает. – Jay

+0

См. Обновленный ответ. –

0

Во-первых, получить данные;

CSVReader reader = new CSVReader(FileUpload1.PostedFile.InputStream); 
string[] headers = reader.GetCSVLine(); 
DataTable dt = new DataTable(); 

foreach (string strHeader in headers) 
{ 
    dt.Columns.Add(strHeader); 
}  

string[] data; 

while ((data = reader.GetCSVLine()) != null) 
{ 
    dt.Rows.Add(data); 
} 

Во-вторых, обработайте свои данные так, как вам хочется;

foreach (DataRow row in dt.Rows) 
{ 
    // do what you want with it 
} 

В-третьих, если у вас нет ничего другого, связанного с данными, привяжите его;

csvReaderGv.DataSource = dt; 
csvReaderGv.DataBind(); 
0

Ваш вопрос не совсем ясен. Вы спрашиваете, как зацикливать DataTable, прежде чем вы его привяжете. Так что же мешает вам просто делать:

foreach(DataRow row in dt.Rows) 
{ 
    // do something with the row and it's fields, e.g. 
    string field1 = row.Field<string>(0); 
    // or all columns_ 
    foreach(DataColumn col in dt.Columns) 
    { 
     string field = row.Field<string>(col); 
    } 
} 
csvReaderGv.DataBind(); 

Но я предполагаю, что вы хотите знать, что это лучший способ, чтобы зациклить DataTable, который связан с ASP.NET GridView. Я предлагаю использовать RowDataBound, который позволяет получить доступ все строки в таблице, а также все строки в GridView:

protected void csvReaderGv_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     DataRow row = ((DataRowView) e.Row.DataItem).Row; 
     string col1 = row.Field<string>(0); 
     // set first cell in GridViewRow: 
     e.Row.Cells[0].Text = col1; 
    } 
} 

Это событие вызывается для каждой строки в сетке, как только вы DataBind его это DataSource все равно в этой строке:

csvReaderGv.DataBind(); 

Так что это «самый дешевый» цикл. Обратите внимание, что оно срабатывает только в том случае, если вы его используете DataBind, поэтому не обязательно при каждой обратной передаче. Если вам нужно получить доступ к GridViewRows при каждой обратной передаче (например, для создания динамических элементов управления в сетке), вы должны использовать вместо этого RowCreated.

+0

Большое спасибо, это также позволит мне иметь только те столбцы, которые мне нужны. – Jay

+0

@Jay: Я должен признать, что я не понял ваш комментарий. Если вы хотите скрыть столбцы, используйте 'GridView.Columns [index] .Visible = false;'. Если вы хотите скрыть ячейки (или сделать что-то другое, например, применить CSS или изменить 'ColumnSpan'), используйте' e.Row.Cells [index] .Visible = false; '. –

+0

Извините, о чем я спрашивал, был ли после того, как я сделал привязку данных, которую я мог бы использовать . – Jay

Смежные вопросы