2016-10-26 17 views
0

ページの読み込み時にGridviewから情報をStringのリストに保存しようとしています。私はその情報を取ってそれをメールで送りたいと思っています。私はこれに関する情報をオンラインで見てきましたが、今までは何も見つかりませんでした。 ViewStateの実装が間違っているか間違っているかどうかはわかりません。助けてください?ViewStateで文字列のリスト

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (ViewState["messages"] != null) 
     { 
      messages = (List<string>)ViewState["messages"]; 
     } 

     if (Page.IsPostBack) 
     { 
      changeByVendor(); 
      //mailFunction(messages); 
     } 
     if (!IsPostBack) 
     { 
      mailFunction(messages); 
     } 
    } 

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 

     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      if ((GridView1.DataSourceID == "SqlDataSource2" || GridView1.DataSourceID == "SqlDataSource1") && !(e.Row.Cells[11].Text.Equals("&nbsp;"))) 
      { 
       DateTime myDate = Convert.ToDateTime(e.Row.Cells[11].Text); 
       if (DateTime.Now > myDate) 
       { 
        e.Row.ForeColor = System.Drawing.Color.Red; 
       } 
       DateTime myDate2 = Convert.ToDateTime(e.Row.Cells[13].Text); 
       if (myDate2 > DateTime.Now && myDate2 < DateTime.Now.AddDays(28)) 
       { 
        e.Row.Cells[13].BackColor = System.Drawing.Color.Yellow; 
        string thisRow = ""; 
        for (int i = 0; i < e.Row.Cells.Count; i++) 
        { 
         thisRow = thisRow + e.Row.Cells[i]; 
        } 
        messages.Add(thisRow); 
       } 
      } 
      else if (GridView1.DataSourceID == "SqlDataSource4" && !(e.Row.Cells[6].Text.Equals("&nbsp;"))) 
      { 
       DateTime myDate = Convert.ToDateTime(e.Row.Cells[6].Text); 
       if (DateTime.Now > myDate) 
       { 
        e.Row.ForeColor = System.Drawing.Color.Red; 
       } 
       DateTime myDate2 = Convert.ToDateTime(e.Row.Cells[7].Text); 
       if (myDate2 > DateTime.Now && myDate2 < DateTime.Now.AddDays(28)) 
       { 
        e.Row.Cells[7].BackColor = System.Drawing.Color.Yellow; 

       } 
      } 
      ViewState["messages"] = messages; 
     } 
    } 
+0

複数の情報がありますか。あなたはそれをリダイレクトしていますか?あなたは何をしているのか詳しく説明できますか? –

+0

OnDataBoundイベント 'if((GridView1.DataSourceID ==" SqlDataSource2 "|| GridView1.DataSourceID ==" SqlDataSource1 ")'でOnDataBoundイベントをチェックしているのですが、それを再バインドしないか、そうでない場合nullの場合、コードをステップ実行するときに 'message'の値は何である必要はありませんか? – MethodMan

+0

[Asp.net ViewStateの理解](https://msdn.microsoft.com/en-us/library/ms972976) aspx) – MethodMan

答えて

0

のは、我々は次の例があるとしましょう:

List<string> input = new List<string>(); 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (ViewState["messages"] != null) 
    { 
     input = (List<string>)ViewState["messages"]; 
    } 
} 
protected void Button1_Click(object sender, EventArgs e) 
{ 
    List<string> msgs = new List<string>() { "1", "2", "3" }; 
    ViewState["messages"] = msgs; 
} 

これは確かにビューステート内の文字列のリストを格納します。問題は、ボタンのクリックイベントをトリガーすると、Page_LoadイベントはBEFORE Button1_Clickイベントを発生させるため、ビューステートはまだ空です。これは、コードをPage_PreRenderイベントに渡すことで管理できます。このイベントは、button_clickイベントの後に発生します。

protected void Page_PreRender(object sender, EventArgs e) 
    { 
    if (ViewState["messages"] != null) 
    { 
     input = (List<string>)ViewState["messages"]; 
    } 
    } 
+0

私はそれを疲れて、何も変わらない。私は情報を何らかの形で間違って格納しているに違いない。GridViewのOnRowイベント – HelixTitan

関連する問題