【问题标题】:Can't get ComboBox to update/refresh无法让 ComboBox 更新/刷新
【发布时间】:2012-01-11 23:36:55
【问题描述】:

我有 2 个表单,我将它们称为 Form1 和 Form2。 Form1 中的代码如下:

public void PrinterDD()
{
    printer.Items.Clear();
    string sprinters = @"filepath";
    using (StreamReader reader = new StreamReader(sprinters))
        try
        {
            while (!reader.EndOfStream)
            {
                string strPrnItem = reader.ReadLine();
                MessageBox.Show(strPrnItem); //just here for troubleshooting purposes
                printer.Items.Add(strPrnItem);
            }
        }
        finally
        {
            reader.Close();
            printer.Update();
            printer.SelectedIndex = 0;
        }
}

Form1 加载时首先调用此方法。组合框(“打印机”)已正确填充。

在 Form2 中,我有一个方法可以写入文件并更改它:

private void accept_Click(object sender, EventArgs e)
{
    this.AcceptButton = accept;
    if (selectedprinters != null && selectedprinters.Items != null && selectedprinters.Items.Count > 0)
    {
        File.Delete(sprinters);
        StreamWriter writer = new StreamWriter(sprinters);
        try
        {
            foreach (object item in selectedprinters.Items)
            {
                writer.WriteLine(item.ToString());
            }
        }
        finally
        {
            writer.Close();
            Voicemails.PrinterDD();
        }                
    }
    this.Close();
}

Voicemails.PrinterDD(); 行运行上面 Form1 中的方法。单步执行代码时,一切似乎都正常;没有错误,文本文件确实使用新值写入。但组合框从未真正更新/刷新以显示新字符串。

我做错了什么?

编辑。我在 Form1 代码中尝试了 printer.Refresh(); 而不是 printer.Update();

ps。我正在使用的文件是一个文本文件,所以我认为我无法将组合框绑定到它,所以我不认为做printer.DataSource = null 然后重新绑定它会起作用。

【问题讨论】:

  • 请不要在您的问题标题前加上“C#”。这就是标签的用途?
  • Voicemails 对象是什么?是Form1的实例吗?
  • 对不起。 Voicemails 是 Form1 的实际类名。为了简单起见,我只是说 Form1

标签: c# combobox refresh


【解决方案1】:

尝试将此添加到 PrinterDD() 方法的开头。

if (InvokeRequired)
{
   BeginInvoke(new NoParamDelegate(PrinterDD));
   return;
}

并添加:

delegate void NoParamDelegate(); 

作为私有财产。

【讨论】:

  • 试过这个按钮似乎没有任何区别。
  • 您是否尝试将“Application.DoEvents()”方法添加到最后的“PrinterDD”方法中。另外,我不确定我是否清楚 InvokeRequired 位。这需要在方法开始时完整,if 语句中没有其他内容,以及之后的所有现有代码。
【解决方案2】:

您可能需要调用Refresh 方法

printer.Refresh();

您可能会考虑使用 DataBinding 来填充您的组合框:

List<string> source = new List<string>();
while (!reader.EndOfStream)
    source.Add(reader.ReadLine());

printer.DataSource = source;
printer.Refresh();

【讨论】:

  • 抱歉,我知道我会错过一些重要的事情。我已经尝试过 printer.Refresh();代替打印机。更新();这在上面的代码中。除非我出于某种原因需要同时使用 Refresh 和 Update 。我会调查数据源,但如果我能够让这个工作......
  • 所以我尝试了数据源。即使在方法的开头有一个“printer.DataSource=null”,最后是一个“printer.DataSource=source”,组合框也永远不会更新。
猜你喜欢
  • 1970-01-01
  • 2013-02-24
  • 2012-01-03
  • 2011-06-02
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
相关资源
最近更新 更多