2011-09-13 15 views
0

こんにちは私はちょっと立ち往生しています。 私はフォーラムを作成しています。私はこのコードで「threadID」を取得しているようです。それを使ってデータベースに投稿します。リピータ内のラベルからIDを取得する

"threadID"は最初のリピータで動的に生成されていますので、その値を取得する必要があります。私は、ブラウザでこのエラーを取得しています現時点では

「コンパイラエラーメッセージ:CS0103:名前は現在のコンテキスト内に存在しない 『スレッドID』が」

はここのコードです:

<h1>viewThread.aspx</h1> 
    <!-- THREAD TEXT STARTS ---> 
    <asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1" EnableViewState="False"> 
     <ItemTemplate> 
      <h2><%# Eval ("threadTitle") %></h2> 
      <!--- THIS THREAD ID NEEDS TO BE GENERATED DYNAMICALLY SO WE CAN THEN GRAB IT TO USE IN THE REPLY ---> 
      <asp:Label ID="threadID" runat="server" Visible="false" Text='<%# Eval ("threadID") %>' /> 
      <%# Eval ("threadText") %> 
     </ItemTemplate> 
    </asp:Repeater> 
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
     ConnectionString="<%$ ConnectionStrings:VSTESTConnectionString %>" 
     SelectCommand="SELECT * FROM [threadCat&amp;Thread] WHERE ([threadID] = @threadID)"> 
     <SelectParameters> 
      <asp:QueryStringParameter DefaultValue="1" Name="threadID" QueryStringField="t" 
       Type="Int32" /> 
     </SelectParameters> 
    </asp:SqlDataSource> 
    <!-- THREAD TEXT ENDS ---> 

    <!-- USER GENERATED REPLYS ---> 
    <h2>Replys</h2> 

    <asp:Repeater ID="Repeater2" runat="server" DataSourceID="SqlDataSource2"> 
     <ItemTemplate> 
      <%#Eval ("postText") %> <br /> 
      Date Posted <%#Eval ("postCreated") %> 
     </ItemTemplate> 
    </asp:Repeater> 
    <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
     ConnectionString="<%$ ConnectionStrings:VSTESTConnectionString %>" 
     SelectCommand="SELECT * FROM [posts] WHERE ([threadID] = @threadID)"> 
     <SelectParameters> 
      <asp:QueryStringParameter DefaultValue="1" Name="threadID" QueryStringField="t" 
       Type="Int32" /> 
     </SelectParameters> 
    </asp:SqlDataSource> 
    <!-- USER GENERATED REPLYS ENDS ---> 

    <!-- REPLY ---> 
    <h2>post a reply</h2> 
    Userid<asp:TextBox ID="userID" runat="server" /><br /> 
    <asp:TextBox ID="postTxt" TextMode="MultiLine" runat="server"></asp:TextBox><br /> 
    <asp:Button ID="reply" runat="server" Text="Reply" onclick="reply_Click" /> 
    <!-- REPLY ENDS ---> 
</asp:Content> 

<h1>viewThread.aspx.cs</h1> 



using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data.SqlClient; 

public partial class viewThread : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void reply_Click(object sender, EventArgs e) 
    { 
     /* threadID is not showing in intellisense */ 
     string thread = threadID.Text; 
     string user = userID.Text; 
     string reply = postTxt.Text; 
     string date = DateTime.Now.ToString(); 
     int locked = 0; 

     SqlConnection sqlCon = new SqlConnection("Server =.\\SQLEXPRESS; Database =VSTEST; Trusted_Connection =True;"); 
     SqlCommand sqlCom = new SqlCommand("INSERT INTO posts(threadID, postBy, postText, postCreated, postLocked) VALUES ('" + thread + "','" + user + "','" + reply + "','" + date + "','" + locked + "')", sqlCon); 
     try 
     { 
      sqlCon.Open(); 
      sqlCom.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      Response.Write("Brokies.... " + ex.ToString()); 
     } 
     finally 
     { 
      sqlCon.Close(); 
      Response.Redirect("/forums/Default.aspx"); 
     } 
    } 
} 

は、ビューステートを使用して問題を解決した、変更は以下の通りです:

public partial class viewThread : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Request.QueryString["t"] != null && Request.QueryString["t"].ToString() != "") 
     { 
      ViewState["threadID"] = Request.QueryString["t"].ToString(); 
     } 
    } 

    protected void reply_Click(object sender, EventArgs e) 
    { 
     string user = userID.Text; 
     string reply = postTxt.Text; 
     string date = DateTime.Now.ToString(); 
     int locked = 0; 

     SqlConnection sqlCon = new SqlConnection("Server =.\\SQLEXPRESS; Database =VSTEST; Trusted_Connection =True;"); 
     SqlCommand sqlCom = new SqlCommand("INSERT INTO posts(threadID, postBy, postText, postCreated, postLocked) VALUES ('" + ViewState["threadID"].ToString() + "','" + user + "','" + reply + "','" + date + "','" + locked + "')", sqlCon); 
     try 
     { 
      sqlCon.Open(); 
      sqlCom.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      Response.Write("Brokies.... " + ex.ToString()); 
     } 
     finally 
     { 
      sqlCon.Close(); 
      Response.Redirect("/forums/Default.aspx"); 
     } 
    } 

} 

答えて

0

Visible="false"の代わりにCSSで可視性を設定してみてください。あなたがデータ・キーを定義することができますので、私は、代わりにListViewコントロールを使用することをお勧めし、正直なところ

Label lbl = Repeater1.Items[0].FindControl("threadID") as Label; 
if (lbl != null) 
{ 
    int threadID = Int32.Parse(lbl.Text); 
} 

<asp:Label ID="threadID" runat="server" style="display:none;" Text='<%# Eval("threadID") %>' /> 

そして、このコードを使用するようにしてください。これは、そのようにはるかに簡単になります。

<asp:ListView ID="ListView1" runat="server" DataKeyNames="threadID"> 
    <ItemTemplate> 
     <h2><%# Eval ("threadTitle") %></h2> 
     <%# Eval ("threadText") %> 
    </ItemTemplate>  
</asp:ListView> 

そして、あなたは背後にあるコードでは、このようthreadIDにアクセスすることができます。

int itemIndex = 0; //index of your current item 
int threadID = (int)ListView1.DataKeys[itemIndex]["threadID"]; 
+0

ちょっとだけ後ろのコードでは、イムはまだ同じエラーを取得することを試みました – noscript

+0

編集された回答を参照してください。 –

+0

ちょっと、私はそれから幸運を得ていません、コンパイラエラーメッセージ:CS0103:名前 'スレッド'は、現在のコンテキストに存在しません。 SQLステートメントを指しているので、値が得られないようです。 – noscript

関連する問題