首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >失去控制会使控制失去焦点,从而重新获得控制。

失去控制会使控制失去焦点,从而重新获得控制。
EN

Stack Overflow用户
提问于 2009-12-30 20:59:55
回答 1查看 197关注 0票数 0

我有一个textbox.Leave事件处理程序,现在我不能从文本框中选择选项卡(我仍然可以单击out)。

以下是添加事件的方式:

...from表格..。

代码语言:javascript
复制
        EKFG_Sig.Config.AutocompleteManager am = new EKFG_Sig.Config.AutocompleteManager(this.GetType().FullName);
        foreach (Control c in this.Controls) {
            if (c is TextBox) {
                TextBox tb = (TextBox)c;
                am.AddAutocomplete(tb);
            }
        }

...from autocompleteManager..。

代码语言:javascript
复制
    public void AddAutocomplete(TextBox control) {
        AutoCompleteStringCollection collection = new AutoCompleteStringCollection();

        DataTable dt = new DataTable("AutoComplete");
        dt.Columns.Add("Name");
        dt.Columns.Add("Values");
        try {
            dt.ReadXml(getAutocompleteFile());
        } catch (Exception) {
            initialize();
        }

        DataRow[] values = dt.Select("Name = '" + Name + "." + control.Name + "'");
        foreach (DataRow row in values) {
            collection.Add(row[1].ToString());
        }

        control.AutoCompleteMode = AutoCompleteMode.Suggest;
        control.AutoCompleteSource = AutoCompleteSource.CustomSource;
        control.AutoCompleteCustomSource = collection;
        control.Leave += Autocomplete_Leave;
    }

    private void Autocomplete_Leave(object sender, EventArgs args){
        ((TextBox)sender).AutoCompleteCustomSource.Add(((TextBox)sender).Text);
        writeAutocomplete(Name + "." + ((TextBox)sender).Name, ((TextBox)sender).Text);
    }

    private static void writeAutocomplete(String name, String addition) {
        DataTable dt = new DataTable("AutoComplete");
        dt.Columns.Add("Name");
        dt.Columns.Add("Values");
        try {
            dt.ReadXml(getAutocompleteFile());
        } catch (Exception) {
            initialize();
        }

        DataRow[] values = dt.Select("Name = '" + name + "'");
        foreach (DataRow row in values) {
            if (row[1].ToString() == addition) {
                return;
            }
        }
        dt.Rows.Add(new object[] { name, addition });
        try {
            dt.WriteXml(getAutocompleteFile());
        } catch (IOException) {
            System.Threading.Thread.Sleep(500);
            try {
                dt.WriteXml(getAutocompleteFile());
            } catch (IOException) {
                //failed to write. ignore
            }
        }
    }

你知道是什么导致了这个问题吗?我该怎么解决呢?

如果我注释掉((TextBox)sender).AutoCompleteCustomSource.Add(((TextBox)sender).Text);,它就能工作。知道为什么吗?我怎么才能保持这条线还能用呢?

EN

回答 1

Stack Overflow用户

发布于 2009-12-30 21:16:57

盯着代码看,唯一可疑的东西是Thread.Sleep。它会不会每次都撞到它,从而使它看起来没有离开呢?

如果你还没做过这些.考虑取出代码并逐行/逐块地添加代码,直到您看到意外的行为。至少可以缩小你的范围。

是否还有其他东西附加到文本框的“离开”事件中,导致了悲伤?

也许在Enter事件上设置一个事件,看看它是否是一种强制恢复焦点的情况,而不是焦点永远不会离开的情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1982460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档