【问题标题】:Timer not getting control textbox data计时器未获取控制文本框数据
【发布时间】:2016-04-18 02:34:23
【问题描述】:

所以我试图从 Timer 执行一个方法,问题是每次我调用该方法并传递一个字符串作为参数时,字符串自动设置为 NULL,这很奇怪,有没有修复或什么,这里有一些想看的代码

    private void timer1_Tick(object sender, EventArgs e)
    {
        int currentHour = FixTime(DateTime.Now.ToString("hh tt"));
        int currentMinute = FixTime(DateTime.Now.ToString("mm tt"));
        int currentSeconds = FixTime(DateTime.Now.ToString("ss tt"));
        string currentTT = DateTime.Now.ToString("tt");

        int userHour = Settings.Default.hour;
        int userMinute = Settings.Default.minutes;
        int userSeconds = Settings.Default.seconds;
        string userTT = Settings.Default.TT;

        if (currentHour == userHour && currentMinute == userMinute &&
            currentSeconds == userSeconds && currentTT == userTT)
        {
            MakeThePost(postTextBox.Text); // the postTextBox.Text field automatically is set to null
        }
    }

    private void MakeThePost(string data)
    {
        string text = data;
        if (!String.IsNullOrEmpty(text))
        {
           fb.Post("me/feed", new { message = text });
        }
        else
            MessageBox.Show("Nothing to post on facebook", "Field is   empty",MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

更新: 所以显然问题不在于计时器,甚至不在 MakeThePost 中,真正的问题在于我试图显示的另一种形式,当它显示时,构造函数会生成一个新的 Form1 对象,为什么我做这个?,因为我想访问主窗体中的控件,但是当我执行 Form1 构造函数来创建一个新对象时,Form1 postTextBox 控件停止更新它的 Text 属性,所以还有另一种访问主窗体的方法控件而不初始化对象?

【问题讨论】:

  • MakeThePost() 方法内部发生了什么? postTextBox.Text 传入函数时的值是多少? (后面可以用断点验证)
  • 您使用的是哪个Timer 类?
  • @heltonbiker 该值是由用户生成的,我总是在它到达那里之前填充文本,但是当它到达计时器时它会自动设置为 null,这就是 MakeThePost() 方法的作用:私人无效MakeThePost(字符串数据){字符串文本=数据; if (!String.IsNullOrEmpty(text)) { fb.Post("me/feed", new { message = text }); } }
  • @Luc Morin System.Windows.Forms.Timer
  • 好的,所以这可能不是 UI 线程问题。什么是间隔?另外,您可以发布MakeThePost 方法(如果不是太长的话)吗?如果您要添加代码而不是在 cmets 中添加代码,请编辑您的问题。它让一切变得更清晰。

标签: c# timer


【解决方案1】:

发布的代码似乎不包含任何会导致postTextBox.Text 属性变为null 的内容。

您的应用程序中必须有其他东西使该属性为空。确保数据绑定没有将其设置为 null

在调用MakeThePost 的行和MakeThePost 的第一行都插入断点,然后运行应用程序。

查看属性是仅在调用之前为null,还是在方法之前和内部都存在。

编辑:

根据您的最新编辑,您似乎正在创建一个新的 Form1 实例,而您可能应该在实例化 Form2 时传递对现有实例的引用

添加一个以Form1 对象为参数的Form2 构造函数:

public partial class Form2 : Form
{
    private Form1 otherForm;
    public Form2()
    {
        InitializeComponent();
    }

    public Form2(Form1 frm) : this()
    {
        otherForm = frm;
    }

    //Other methods and properties of Form2
}

然后创建Form2的新实例:

Form2 secondForm = new Form2(form1Instance);

现在,在Form2 实例中,您拥有otherForm 引用,这将允许您调用Form1 实例的公共成员。您可能需要更改某些 Form1 成员的访问修饰符才能将它们公开。

【讨论】:

  • 我已经用断点检查了很多时间,问题出在计时器上,我尝试在按钮单击事件中使用 postTextBox.Text,效果很好,问题出在计时器上它有什么问题,就像它没有得到控件文本,数据可能计时器正在另一个我不知道的线程中运行,我什至尝试使用 Console.WriteLine(postTextBox.Text) 并没有打印任何内容,但在它之外它得到了打印,它应该打印一些东西,因为它是实时的,所以每次我在文本框中写东西时它应该打印:/.
  • 我现在所能提供的只是让您将完整的 VS 解决方案(压缩)发布到文件共享服务中,我明天可以看看。现在打算做一些Z。干杯。
  • 我不想把我所有的工作都给我,我只会给你,如果你找到解决方案,请在这里发布。 :{
  • 我能把你的邮件也给我吗?
  • 那行得通,现在应用程序正在运行 Ty Luc Morin,在实例化 Form2 时必须传递 this 作为参考
猜你喜欢
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
相关资源
最近更新 更多