2017-09-28 6 views
1

이전 asp.net 웹 응용 프로그램을 사용하고 있고 다른 스레드에서 부트 스트랩 텍스트 상자에 텍스트를 쓰려고 할 때 문제가 있습니다.다른 스레드/클래스에서 텍스트 상자에 쓰기

하여 default.aspx.cs :

using System.Text; 
using System.IO; 
using System.Diagnostics; 
using System.Threading; 
using AspNet; 

namespace ProblemApp 
{ 
    public partial class _Default : Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected void UpdateButton_Click(object sender, EventArgs e) 
     { 
      if (this.TextBox1.Text == "") 
      { 
       TextBox1.Text = "TEST"; 
      } 
     } 

     protected void UpdateButton2_Click(object sender, EventArgs e) 
     { 
      AutoLogControl NewAutoLogger = new AutoLogControl(); 
      Thread AutoLoggerThread = new Thread(() => NewAutoLogger.StartAutoLogger(sender)); 
      AutoLoggerThread.Start(); 
     } 
    } 
} 

Autolog.cs : 당신이 볼 수 있듯이

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.IO; 
using System.Web; 
using System.Web.UI; 
using System.Text; 
using System.Data; 
using System.Data.SqlClient; 
using System.Data.SqlTypes; 
using System.Text.RegularExpressions; 

namespace ProblemApp 
{ 
    public partial class AutoLogControl : _Default 
    { 
     public void StartAutoLogger(object sender) 
     { 
      //would normally listen for a condition to be met, but for 
      //this example, just set the Textbox. This is where my issue 
      //is. TextBox is null. 
      TextBox1.Text = "TEST 2"; 
     } 
    } 
} 

, 내가 설정해야합니다 나는 아래의 코드로 웹 응용 프로그램을 단순화 StartAutoLogger(), TextBox하지만 시도 할 때 null 참조를 가져옵니다. 텍스트를 설정하려면 _Default 내에서 공용 메서드를 만드는 등 여러 가지 다른 솔루션을 시도했지만이 작동하지 않습니다. 필요한 경우 지원 파일이 있습니다.

을 Default.aspx :

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ProblemApp._Default" %> 

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server"> 


    <div class="row panel-body verticle-align"> 
     <div class="col-lg-3"> 
      <h4><span class="label label-default"> Text Box : </span></h4> 
     </div> 
     <div class="col-lg-9"> 
      <asp:TextBox ID ="TextBox1" name="Textbox1" runat="server" Width="100%" /> 
     </div> 
    </div> 
    <div class="row btn-block panel-body"> 
     <div class="col-lg-4"> 
      <asp:Button ID="UpdateButton" runat="server" OnClick="UpdateButton_Click" Text="Update" CssClass="btn btn-default" /> 
     </div> 
       <div class="col-lg-4"> 
      <asp:Button ID="UpdateButton2" runat="server" OnClick="UpdateButton2_Click" Text="Update 2" CssClass="btn btn-default" /> 
     </div> 
    </div> 

</asp:Content> 

Default.aspx.designer.cs는 :

namespace ProblemApp { 


public partial class _Default { 

    protected global::System.Web.UI.WebControls.TextBox TextBox1; 

    protected global::System.Web.UI.WebControls.Button UpdateButton; 

    protected global::System.Web.UI.WebControls.Button UpdateButton2; 
} 
} 
+0

ID "TextBox"를 다른 것으로 변경하고 더 나은 이름을 가진 이름 속성을 추가 할 수 있습니까? –

+0

명확성을 위해 업데이트되었습니다. – user7991682

답변

0

당신은 뒤로 당신의 상속을 가질 수있다. AutoLogControl에서 당신은 당신이 정말로 전화하는거야

TextBox1.Text = "TEST 2"; 

을 참조 할 때 :

_Default.TextBox1; 

당신은 sender을 전달하는 : 페이지의 실제 텍스트 상자에 대한 참조하지

AutoLogControl.TextBox1.Text = "TEST 2"; 

객체를 매개 변수로 사용하면 다음과 같이 할 수 있습니다.

    그것에
  1. 캐스트 송신자는, AutoLogClass이 작업을 수행하는 경우

  2. 가 (아마 추가 매개 변수를 지정) 관련 페이지를 원하는 제어를위한

  3. 검색을 얻을 적절한 유형

에게있어 _Default을 상속해서는 안되지만 System.Web.UI.UserControl 일 수 있으며 StartAutoLogger을 정적 방법으로 표시해야합니다.

다른 방법으로 당신은 _Default 사용하는 대신 AutoLogControl에서 상속 할 수 있습니다 :

Thread AutoLoggerThread = new Thread(() => this.StartAutoLogger(sender)); 
AutoLoggerThread.Start(); 

을 나는 AutoLogClass의 컨텍스트를 모르는 있지만, 그 적합하지 않을 수 있도록. 어느 경우

는 현재 AutoLogClass 정도로 new로 인스턴스화하는 단계 _Default 새로운 페이지를 생성하는 _Default 여기서 일본어 _Default 다른 컨트롤. 컨트롤을 참조하면 사실 AutoLogClass의 부모에 존재하기 때문에 컴파일러 오류가 발생하지 않지만 초기화되지는 않습니다. null.

+0

내 문제에 대한 훌륭한 설명에 감사드립니다. 불행히도 귀하의 솔루션이 나를 위해 작동하지 않습니다. 만약'AutoLogControl'이'System.Web.UI.UserControl'에서 상속 받고'_Default'가'AutoLogControl'에서 상속 받았다면 당신의 제안을 사용하십시오 : 'Thread AutoLoggerThread = new Thread (() => this.StartAutoLogger (발신자));' 'AutoLoggerThread.Start(); ' 나는 TextBox1'이 현재 컨텍스트에 존재하지 않는'한다고 AutoLogger.cs''에서 컴파일 오류가 발생합니다. – user7991682

+0

@ user7991682 당신 말이 맞아요.'_Default'가'AutoLogControl'을 상속하면'AutoLogControl'에는'TextBox1'의 인스턴스가 없습니다. 'TextBox1'을 명시 적으로 사용하는 대신 대상 객체를 포함하는 매개 변수를 전달하지 않으시겠습니까? 'this.StartAutoLogger (sender, target)' – Enfyve

+0

@ user7991682와 같은 것은 아마도'StartAutoLogger'를 generic으로 만들어서'target'의 타입을 포함 할 수 있습니다.'StartAutoLogger' 안에'target as T'를 캐스팅 할 수 있습니다. 'TextBox' 이외의 것을 전달하십시오.) – Enfyve