2016-10-08 29 views
0

2つの日付を減算し、その間の日数をポストバックすることで曜日を計算するコードをテストします。ここ ASP.NET IDのコントロールIDが認識されない、エラー '現在のコンテキストに名前が存在しません。'

using System; 

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

    } 

    protected void calculateDays(object sender, EventArgs e) 
    { 

     string startdate = txtStartDate.Text; 
     string enddate = txtEndDate.Text; 
     if (startdate != "" && enddate != "") 
     { 
      DateTime t1 = Convert.ToDateTime(startdate); 
      DateTime t2 = Convert.ToDateTime(enddate); 
      totalDays.Text = t2.Subtract(t1).Days.ToString(); 
     } 
    } 
    } 
} 

すべてが完璧に働いていると、それはやっていることになって何やっている

CalculateDaysTest1.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CalculateDaysTest1.aspx.cs" Inherits="PopeyeMarinaWebApp.Templates.CalculateDaysTest1" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Calculate Dates Test 1</title> 
    <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"/> 
    <script src="https://code.jquery.com/jquery-1.12.4.js"></script> 
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> 
</head> 

<body> 
    <form id="form1" runat="server"> 
    <div> 
     <div class="formitem"> 
      <asp:Label ID="startDateLabel" CssClass="formlabel" runat="server" Text="Start Date:"></asp:Label> 
      <asp:TextBox ID="txtStartDate" CssClass="DatePicker" runat="server" AutoPostBack="True" OnTextChanged="calculateDays"></asp:TextBox> 
     </div> 
     <div class="formitem"> 
      <asp:Label ID="endDateLabel" CssClass="formlabel" runat="server" Text="End Date:"></asp:Label> 
      <asp:TextBox ID ="txtEndDate" CssClass="DatePicker" runat="server" AutoPostBack="True" OnTextChanged="calculateDays"></asp:TextBox> 
     </div> 
     <div class="formitem"> 
      <asp:Label ID="totalDaysLabel" CssClass="formlabel" runat="server" Text="Number of Days:"></asp:Label> 
      <asp:Label ID="totalDays" CssClass="idlabel" runat="server" Text=""></asp:Label> 
     </div> 
    </div> 
    <script> 
     $(function() { 
      $('.DatePicker').datepicker(
      { 
       dateFormat: 'dd/mm/yy', 
       changeMonth: true, 
       changeYear: true, 
       yearRange: '1950:2100' 
      }); 
     }) 
    </script> 
    </form> 
</body> 
</html> 

CalculateDaysTest1.cs

は、ここで最初のテストです。開始日と終了日を選択し、計算日をポストバックします。

2番目のテストでは、モデルバインディングを使用したフォームビューコントロールのコンテキストで使用しています。ここで

テスト2:

CalculateDaysTest2.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CalculateDaysTest2.aspx.cs" Inherits="PopeyeMarinaWebApp.Templates.CalculateDaysTest2" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Calculate Dates Test 2</title> 
    <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"/> 
    <script src="https://code.jquery.com/jquery-1.12.4.js"></script> 
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:FormView ID="FormView1" runat="server" 
      ItemType="PopeyeMarinaWebApp.Models.Lease" 
      DataKeyNames="LeaseID" 
      RenderOuterTable="false" 
      DefaultMode="Insert" 
      InsertMethod="LeaseFormAdd_InsertItem"> 
      <InsertItemTemplate> 
       <fieldset> 
        <div class="formitem"> 
         <asp:Label ID="startDateLabel" CssClass="formlabel" runat="server" Text="Start Date:"></asp:Label> 
         <asp:TextBox ID="txtStartDate" CssClass="DatePicker" runat="server" AutoPostBack="True" OnTextChanged="calculateDays" Text="<%#: BindItem.StartDate %>"></asp:TextBox> 
        </div> 
        <div class="formitem"> 
         <asp:Label ID="endDateLabel" CssClass="formlabel" runat="server" Text="End Date:"></asp:Label> 
         <asp:TextBox ID ="txtEndDate" CssClass="DatePicker" runat="server" AutoPostBack="True" OnTextChanged="calculateDays" Text="<%#: BindItem.EndDate %>"></asp:TextBox> 
        </div> 
        <div class="formitem"> 
         <asp:Label ID="totalDaysLabel" CssClass="formlabel" runat="server" Text="Number of Days:"></asp:Label> 
         <asp:Label ID="totalDays" CssClass="idlabel" runat="server" Text=""></asp:Label> 
        </div> 
        <div class="col-lg-12"> 
         <asp:Button ID="InsertButton" runat="server" Text="Insert" CausesValidation="True" CssClass="btn btn-primary btn-sm" CommandName="Insert" /> 
         <asp:Button ID="CancelButton" runat="server" Text="Cancel" CssClass="btn btn-primary btn-sm" CommandName="Cancel"/> 
        </div> 
       </fieldset> 
      </InsertItemTemplate> 
     </asp:FormView> 
    </div> 
    <script> 
     $(function() { 
      $('.DatePicker').datepicker(
      { 
       dateFormat: 'dd/mm/yy', 
       changeMonth: true, 
       changeYear: true, 
       yearRange: '1950:2100' 
      }); 
     }) 
    </script> 
    </form> 
</body> 
</html> 

CalculateDaysTest2.cs

using System; 
using PopeyeMarinaWebApp.Models; 

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

    } 

    public void LeaseFormAdd_InsertItem() 
    { 
     var item = new Lease(); 
     TryUpdateModel(item); 
     if (ModelState.IsValid) 
     { 
      using (MarinaDBContext db = new MarinaDBContext()) 
      { 
       db.Leases.Add(item); 
       db.SaveChanges(); 
      } 
     } 
    } 

    protected void calculateDays(object sender, EventArgs e) 
    { 

     string startdate = txtStartDate.Text; 
     string enddate = txtEndDate.Text; 
     if (startdate != "" && enddate != "") 
     { 
      DateTime t1 = Convert.ToDateTime(startdate); 
      DateTime t2 = Convert.ToDateTime(enddate); 
      totalDays.Text = t2.Subtract(t1).Days.ToString(); 
     } 
    } 
    } 
} 

ここで私が言うcalculateDaysイベントでエラーを取得しています: 「 name 'textStartDate'は現在のコンテキスト ' 'に存在しません 'textEndDate'という名前は現在のコンテキストに存在しません' ' 'totalDays'という名前は現在のコンテキストに存在しません。 '

これはフォームビューコントロールではうまくいかないのですが、どうすればいいのか不思議です。

ご協力いただければ幸いです。

デビッド

答えて

0

あなたは「ASP:FormViewコントロール」内のコードを配置した、背後にあるコードで直接あなたのTextBoxのetcにアクセスするからあなたを妨げています。

FormViewのコマンドを処理するために何か設定が必要です。コードの背後には、このようなものが必要です。下の例は私の頭の上から書かれていますが、

void FormView1_ItemCommand(Object sender, FormViewCommandEventArgs e) 
{ 
    TextBox txtStartDate = (TextBox)e.Item.FindControl("txtStartDate"); 
    if (e.CommandName == "Insert") 
    { 
     // Your logic here 
    } 
} 

注意このコードは、aspxページのFormViewの "OnItemCommand"プロパティを使用して接続する必要があります。

もっと広範な例については、MSDNのドキュメントを参照してください。

https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.formview.itemcommand(v=vs.110).aspx

の背後にあるコードでテキストボックスのどこかにアクセスするためとして、あなたはFormViewコントロールのFindControlメソッドを使用する必要があります。これらのいずれかのような何か:

TextBox txtStartDate = (TextBox)FormView1.Row.FindControl("txtStartDate"); 

それとも

TextBox txtStartDate = (TextBox)FormView1.InsertItem.FindControl("txtStartDate"); 
+0

私はそのコードで、今では私にエラーを与えて入力された:「FormViewCommandEventArgsは」 '「項目」と無extenionメソッドの定義が含まれていませんがFormViewCommandEventArgs '型の最初の引数を受け入れる項目'が見つかりました。 –

+0

2番目のコードを試してみると、私のために機能し、フォームビューのテキストボックスにアクセスできます。ありがとう。 –

関連する問題