从另一个线程/类写入文本框
我正在使用旧的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;
}
}
你可能有你的产业倒退。在AutoLogControl
当你引用
TextBox1.Text = "TEST 2";
你实际上调用:
AutoLogControl.TextBox1.Text = "TEST 2";
这是不是你的页面上的文本框实际的参考:
_Default.TextBox1;
您传递sender
对象作为参数,所以你可以:
演员发送到它的适当类型
得到相关网页
搜索所需的控制(可能是指定一个额外的参数)
如果你要做到这一点,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
。
谢谢你对我的问题的一个很好的解释!不幸的是,虽然你的解决方案不适合我。如果我将'AutoLogControl'设置为从'System.Web.UI.UserControl'继承,'_Default'从'AutoLogControl'继承,那么使用您的建议 'Thread AutoLoggerThread = new Thread((()=> this.StartAutoLogger(发件人));' 'AutoLoggerThread.Start();' 我得到了'AutoLogger.cs'编译错误,指出'TextBox1'不会在当前的背景下存在。 – user7991682
@ user7991682你是对的,如果'_Default'从'AutoLogControl'继承,'AutoLogControl'没有'TextBox1'的实例。为什么不传递包含目标对象的参数,而不是显式使用'TextBox1'?像'this.StartAutoLogger(发送者,目标)' – Enfyve
@ user7991682可能使'StartAutoLogger'通用,因此你可以包含'target'的类型,然后在'StartAutoLogger'里面你可以把'target作为T'(假设你想要通过除“TextBox”之外的其他东西) – Enfyve
您可以将ID“TextBox”更改为不同的内容并添加具有更好命名的名称属性 –
为了清晰起见进行了更新。 – user7991682