2017-09-28 71 views
1

我正在使用舊的asp.net web應用程序,並且遇到了嘗試將文本寫入另一個線程的引導文本框的問題。我已經簡化了網絡應用程序轉換的代碼如下所示:從另一個線程/類寫入文本框

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,但是當我嘗試時我得到一個空引用。我嘗試了其他幾種解決方案,例如在_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"; 

你實際上調用:

AutoLogControl.TextBox1.Text = "TEST 2"; 

這是不是你的頁面上的文本框實際的參考:

_Default.TextBox1; 

您傳遞sender對象作爲參數,所以你可以:

  1. 演員發送到它的適當類型

  2. 得到相關網頁

  3. 搜索所需的控制(可能是指定一個額外的參數)

如果你要做到這一點,AutoLogClass不應該從_Default繼承,但可能System.Web.UI.UserControl並應該將StartAutoLogger作爲靜態方法公開。

或者你可以從_Default繼承AutoLogControl,而是使用:

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

雖然我不知道AutoLogClass的背景下,這樣可能不適合。

在這兩種情況下,目前AutoLogClass_Default所以用new實例它會創建一個新_Default頁面,從原來的_Default不同的控件。提到控件不會拋出編譯器錯誤,因爲它們實際上存在於AutoLogClass的父節點中,但它們未初始化,因此:null

+0

謝謝你對我的問題的一個很好的解釋!不幸的是,雖然你的解決方案不適合我。如果我將'AutoLogControl'設置爲從'System.Web.UI.UserControl'繼承,'_Default'從'AutoLogControl'繼承,那麼使用您的建議 'Thread AutoLoggerThread = new Thread((()=> this.StartAutoLogger(發件人));' 'AutoLoggerThread.Start();' 我得到了'AutoLogger.cs'編譯錯誤,指出'TextBox1'不會在當前的背景下存在。 – user7991682

+0

@ user7991682你是對的,如果'_Default'從'AutoLogControl'繼承,'AutoLogControl'沒有'TextBox1'的實例。爲什麼不傳遞包含目標對象的參數,而不是顯式使用'TextBox1'?像'this.StartAutoLogger(發送者,目標)' – Enfyve

+0

@ user7991682可能使'StartAutoLogger'通用,因此你可以包含'target'的類型,然後在'StartAutoLogger'裏面你可以把'target作爲T'(假設你想要通過除「TextBox」之外的其他東西) – Enfyve

相關問題