天道酬勤,学无止境

如何动态更改C#组合框或文本框中的自动完成条目?(How can I dynamically change auto complete entries in a C# combobox or textbox?)

问题

我在C#中有一个组合框,我想使用自动完成建议,但是我希望能够根据用户类型来更改自动完成条目,因为可能的有效条目太多了,无法在启动时填充AutoCompleteStringCollection

例如,假设我让用户输入名称。 我有一个可能的名字列表(“ Joe”,“ John”)和一个姓氏列表(“ Bloggs”,“ Smith”),但是如果我每个都有一千个,那将是一百万个可能的字符串-太多,无法放入自动完成条目。 因此,最初,我只希望使用名字作为建议(“ Joe”,“ John”),然后在用户键入名字(“ Joe”)之后,我想删除现有的自动完成条目并替换为他们添加了一组新名称,其中包括所选的名字以及可能的姓氏(“ Joe Bloggs”,“ Joe Smith”)。 为了做到这一点,我尝试了以下代码:

void InitializeComboBox()
{
    ComboName.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
    ComboName.AutoCompleteSource = AutoCompleteSource.CustomSource;
    ComboName.AutoCompleteCustomSource = new AutoCompleteStringCollection();
    ComboName.TextChanged += new EventHandler( ComboName_TextChanged );
}

void ComboName_TextChanged( object sender, EventArgs e )
{
    string text = this.ComboName.Text;
    string[] suggestions = GetNameSuggestions( text );

    this.ComboQuery.AutoCompleteCustomSource.Clear();
    this.ComboQuery.AutoCompleteCustomSource.AddRange( suggestions );
}

但是,这不能正常工作。 似乎对Clear()的调用会导致自动完成机制“关闭”,直到组合框中出现下一个字符,但是,当然,当下一个字符出现时,上述代码再次调用Clear(),因此用户永远不会实际上看到了自动完成功能。 它还会导致组合框的所有内容都被选中,因此在每次按键之间您都必须取消选择现有文本,这使其无法使用。 如果删除对Clear()的调用,则自动完成功能会起作用,但是AddRange()调用似乎无效,因为我添加的新建议不会出现在自动完成下拉列表中。

我一直在寻找解决方案,发现有各种各样的建议,但我无法使它们正常工作-自动完成功能似乎已禁用,或者未出现新字符串。 这是我尝试过的事情的清单:

  • 在更改字符串之前调用BeginUpdate()然后再更改EndUpdate()
  • 在所有现有字符串而不是Clear()上调用Remove() ()。
  • 当我更新字符串时,请从组合框中清除文本,然后再添加回去。
  • 更改字符串时将AutoCompleteMode设置为“ None”,然后再将其设置回“ SuggestAppend”。
  • 挂钩TextUpdateKeyPress事件,而不是TextChanged
  • 每次用新的AutoCompleteStringCollection替换现有的AutoCompleteCustomSource

这些都无济于事,即使是各种组合也无济于事。 Spence建议我尝试覆盖ComboBox函数,该函数可获取要在自动完成中使用的字符串列表。 使用反射我发现一对夫妇的方法在ComboBox类看好- GetStringsForAutoComplete()SetAutoComplete()但它们都是私人,所以我无法从派生类访问它们。 我再也做不到了。

我尝试用TextBox替换ComboBox ,因为自动完成界面是相同的,并且我发现行为略有不同。 使用TextBox似乎可以更好地工作,因为自动完成的Append部分可以正常工作,而Recommendation部分则不能-建议框会短暂闪烁,然后立即消失。

因此,我认为“好吧,我将不再使用“建议”功能,而仅使用Append”,但是当我将AutoCompleteMode设置为Append时,会出现访问冲突异常。 提示会发生相同的事情-唯一不会引发异常的模式是SuggestAppend ,即使“提示”部分随后无法正确运行。

我认为使用C#托管代码时应该不可能获得访问冲突异常。 Avram建议我使用“锁定”来解决此问题,但我不知道该锁定什么-唯一具有SyncRoot成员的东西是AutoCompleteStringCollection ,而锁定不会阻止访问冲突异常。 我还尝试了锁定ComboBoxTextBox ,但这也无济于事。 据我了解,锁只会阻止其他锁,因此,如果基础代码未使用锁,那么我使用它不会有任何区别。

所有这些的结果是,我目前无法使用具有动态自动完成功能的TextBoxComboBox 。 有谁对我如何实现这一目标有任何见解?

更新:

我仍然没有这个工作,但我发现了更多。 也许其中一些会激发其他人提出解决方案。

我尝试用TextBox替换ComboBox ,因为自动完成界面是相同的,并且我发现行为略有不同。 使用TextBox似乎可以更好地工作,因为自动完成的Append部分可以正常工作,而Recommendation部分则不能-建议框会短暂闪烁,然后立即消失。

因此,我认为“好吧,我将不再具有“建议”功能,而仅使用Append,”,但是当我将AutoCompleteMode设置为Append时,会出现访问冲突异常。 提示会发生相同的事情-唯一不会引发异常的模式是SuggestAppend ,即使“提示”部分随后无法正确运行。

我认为使用C#托管代码时应该不可能获得访问冲突异常,但是无论如何,结果是我目前无法使用具有任何动态自动完成功能的TextBoxComboBox 。 有谁对我如何实现这一目标有任何见解?

更新2:

在尝试了其他各种事情之后,例如在工作线程中更改了自动完成功能,并使用BeginInvoke()模拟了PostMessage()类型的行为,我最终放弃了,只是使用列表框实现了自己的自动完成下拉菜单。 它比内置的响应速度要快得多,而且我花费的时间少于使内置的响应工作的时间,所以对于其他想要这种行为的人来说,这是一个教训-您可能会更好自己实施。

回答1

我遇到了同样的问题,并找到了一个非常简单的解决方法。 像这里的其他所有人一样,我找不到任何方法来控制组件的行为,因此我不得不接受它。

自然的行为是:每次用户在文本框中键入内容时,您都无法动态填充列表。 您只需要填充一次,然后“自动完成”机制就可以控制。 结论是:您应该在数据库中填充所有可能的条目,以使AutoCompleteCustomSource可以按我们期望的方式工作。

当然,如果您有数百万条记录要填充列表,那么这是不可行的。 数据传输中的性能问题和自动完成机制本身将不允许您这样做。

我发现的折衷解决方案是:每当Text长度恰好达到N个字符(在我的情况下为3个字符)时,动态填充AutoCompleteCustomSource。 之所以可行,是因为大大降低了复杂性。 从数据库中获取的与这3个初始字符匹配的记录数足够小,可以避免任何性能问题。

主要缺点是:除非输入第N个字符,否则不会向用户显示“自动完成”列表。 但是,似乎用户并不真正希望输入3个字符之前有一个有意义的自动完成列表。

希望这可以帮助。

回答2

这对我addRange ,您不必将addRange到相同的AutoCompleteStringCollection ,而是每次创建一个新的。

form.fileComboBox.TextChanged += (sender, e) => {
    var autoComplete = new AutoCompleteStringCollection();
    string[] items = CustomUtil.GetFileNames();
    autoComplete.AddRange(items);
    form.fileComboBox.AutoCompleteCustomSource = autoComplete;
};
回答3

我认为您可能想摆脱反射器,并考虑覆盖组合框自身中的自动完成行为。 我确定自动完成功能会调用一个访问自动完成列表的函数。 如果可以找到并覆盖此功能,则可以使用任何所需的行为。

查看可以在combobox类本身上找到哪些文档。

回答4

我没有对此进行测试,但是可能值得一试。

通过保留两个实例来加倍缓冲,而不是清除AutoCompleteCustomSource。 当文本更改时,调用GetNameSuggestions()并为当前未使用的字符串构建字符串,然后将ComboName.AutoCompleteCustomSource设置为刚设置的字符串。

我认为应该看起来像这样。

AutoCompleteCustomSource accs_a;
AutoCompleteCustomSource accs_b;
bool accs_check = true; //true for accs_a, false for accs_b
void InitializeComboBox()
{
    ComboName.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
    ComboName.AutoCompleteSource = AutoCompleteSource.CustomSource;

    accs_a = new AutoCompleteStringCollection();
    accs_b = new AutoCompleteStringCollection();

    ComboName.AutoCompleteCustomSource = accs_a;
    ComboName.TextChanged += new EventHandler( ComboName_TextChanged );
}

void ComboName_TextChanged( object sender, EventArgs e )
{
    string text = this.ComboName.Text;

    if(accs_check)
    {
       accs_b.Clear();
       accs_b.AddRange(GetNameSuggestions( text ));
       accs_check = false;
    }
    else
    {
       accs_a.Clear();
       accs_a.AddRange(GetNameSuggestions( text ));
       accs_check = true;
    }

    this.ComboQuery.AutoCompleteCustomSource = accs_check? accs_a : accs_b;
}
回答5

更新:锁定此位置的主要原因是

它的工作:)我绝大部分的“神秘异常”都消失了。


  1. 像这段代码中的锁,可以帮助您处理异常
  2. 正如您之前提到的,使用文本框的问题较少
  3. 在此代码中,SuggestAppend正常工作


    private void Form1_Load(object sender, EventArgs e)
    {
        textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
        textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;

        textBox1.TextChanged+=new EventHandler(textBox1_TextChanged);

        col1.AddRange(new string[] { "avi avi", "avram avram" });
        col2.AddRange(new string[] { "boria boria", "boris boris" });

        textBox1.AutoCompleteCustomSource = col1;
        textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
    }
    AutoCompleteStringCollection col1 = new AutoCompleteStringCollection();
    AutoCompleteStringCollection col2 = new AutoCompleteStringCollection();

    object locker = new object();
    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        lock (locker)
        {
            if (textBox1.Text.StartsWith("a") && textBox1.AutoCompleteCustomSource != col1)
            {
                textBox1.AutoCompleteCustomSource = col1;
            }
            if (textBox1.Text.StartsWith("b") && textBox1.AutoCompleteCustomSource != col2)
            {
                textBox1.AutoCompleteCustomSource = col2;
            }
        }
    }
回答6

山姆,你明白了吗? 我遇到了同样的情况。 Clear()似乎导致异常。 我删除了要清除的电话,尽管收藏不断增长,但我得到了正确的建议事件...

另外,关于私有成员:您可以使用反射来访问它们:

PropertyInfo[] props = [object].GetType().GetProperties({flags go here});
props[0].SetValue(this, new object[] { 0 });
回答7
if(!textBox3.AutoCompleteCustomSource.Contains(textBox3.Text))
   textBox3.AutoCompleteCustomSource.Add(textBox3.Text);
回答8

我最初来这里是为了寻找解决方案,但现在找到了我自己的解决方案。

诀窍不是在AutoCompleteCustomSource上调用Clear(),而是在for循环中删除所有项目,然后使用新数据重建列表。 在我的情况下(一个藏书应用程序),我正在从数据库中检索具有特定起始字母而不是全部字母的作者姓名。 请注意,这仅在组合框的文本框部分为空或已为空时才起作用。

    private void cboAuthor_KeyDown(object sender, KeyEventArgs e)
    {
        if (cboAuthor.Text.Length == 0)
        {
            // Next two lines simple load data from the database in the
            // into a collection (var gateway), base on first letter in
            // the combobox. This is specific to my app.
            var gateway = new AuthorTableGateway();
            gateway.LoadByFirstLetter(Char.ConvertFromUtf32(e.KeyValue)[0]);

            // Clear current source without calling Clear()
            for (int i = 0; i < authorsAutoComplete.Count; i++)
                authorsAutoComplete.RemoveAt(0);

            // Rebuild with new data
            foreach (var author in gateway)
                authorsAutoComplete.Add(author.AuthorName);
        }
    }
回答9

尚未尝试过,但是对于您的特定情况,您可以编写类似以下内容的代码:

    private void txtAutoComplete_KeyUp(object sender, KeyEventArgs e)
    {

        String text = txtAutoComplete.Text;

        if (text.EndsWith(" "))
        {

            string[] suggestions = GetNameSuggestions( text ); //put [text + " "] at the begin of each array element
            txtAutoComplete.AutoCompleteCustomSource.Clear();
            txtAutoComplete.AutoCompleteCustomSource.AddRange( suggestions );

        }

    }
回答10

对我来说,秘密是使用TextChanged事件,而没有KeyDown / Up / Press等。

更新:在动态更改AutoCompleteCustomSource存在其他问题之后,我最终放弃了使用内置的自动完成功能,并在比最初浪费的时间短得多的时间内实现了自己的功能。 在实现ComboBox控件的非托管代码中似乎存在一些问题。 具体来说,我在应该何时触发TextChanged事件处理程序时遇到问题。 我决定在我的自定义实现中仅使用OnKeyDown / Press / Up处理程序,这似乎更可靠。

回答11

最好的解决方案是使用combobox的事件处理程序。 通过使用textUpdate KeyDown DropDownChangeCommit ,您可以模仿自动完成模式,还可以自定义要搜索的内容以及在下拉菜单中显示的内容。

我发现这个答案很有用,但它是用Visual C ++编写的,它是toolstripcombobox,但概念是相同的。 无论如何,.net中的c#和c ++有着巨大的相似性,并且在理解解决方案方面应该不是问题。

Visual C ++中ToolStripCombobox的自定义自动搜索

回答12

我知道这是一个非常老的问题,但今天仍然存在。 我的解决方法是将“自动完成”模式和源属性设置为“无”,并在KeyUp事件上手动更新项目。

我敢肯定,它很hacky,但是无论输入数据的速度如何,它对我来说都完美无缺了相当长的一段时间,而且头发的额外好处开始恢复。

您还可以选择是只建议还是建议并附加。 我希望它可以帮助某人。

private void comboBox1_KeyUp(object sender, KeyEventArgs e)
    {

        if (string.IsNullOrWhiteSpace(comboBox1.Text))
        {
            e.Handled = true;
            return;
        }
        if (comboBox1.Text.Length < 3)
        {
            e.Handled = true;
            return;
        }

        if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Up)
        {
            e.Handled = true;
            return;
        }
        else if (e.KeyCode == Keys.Back)
        {
            e.Handled = true;
            return;
        }

        string text = comboBox1.Text;

        if (e.KeyCode == Keys.Enter)
        {
            comboBox1.DroppedDown = false;
            comboBox1.SelectionStart = text.Length;
            e.Handled = true;
            return;
        }

        List<string> LS = Suggestions(comboBox1.Text);

        comboBox1.Items.Clear();
        comboBox1.Items.AddRange(LS.ToArray());

        //If you do not want to Suggest and Append
        //comment the following line to only Suggest
        comboBox1.Focus();

        comboBox1.DroppedDown = true;
        comboBox1.SelectionStart = text.Length;

        //Prevent cursor from getting hidden
        Cursor.Current = Cursors.Default;
        e.Handled = true;
    }
回答13

在尝试了这里提供的所有解决方案之后(没有成功),我发现了一些对我有用的东西:

private void CellBox_TextChanged(object sender, EventArgs e)
{
    ((TextBox)sender).TextChanged -= CellBox_TextChanged;
    ((TextBox)dataGridView1.EditingControl).AutoCompleteMode = AutoCompleteMode.None;
    ((TextBox)dataGridView1.EditingControl).AutoCompleteCustomSource = null;                
    aCSC.Clear();
    foreach (string value in Autocompletevalues())
    {
        aCSC.Add(value);
    }
    ((TextBox)dataGridView1.EditingControl).AutoCompleteCustomSource = aCSC;
    ((TextBox)dataGridView1.EditingControl).AutoCompleteMode = AutoCompleteMode.Suggest;
    ((TextBox)sender).TextChanged += CellBox_TextChanged;
}

脚步:

  • 禁用事件处理程序
  • 禁用自动完成模式
  • 将Source设置为null
  • 更新AutoCompleteStringCollection(aCSC)
  • 将Source设置为更新的AutoCompleteStringCollection
  • 激活自动完成模式
  • 启用事件处理程序

我希望它可以帮助某人..

回答14

使用此代码

private void dataGridView1_EditingControlShowing(object sender,DataGridViewEditingControlShowingEventArgs e)
    {

        if (e.Control is DataGridViewComboBoxEditingControl)
        {
            ((ComboBox)e.Control).DropDownStyle = ComboBoxStyle.DropDown;
            ((ComboBox)e.Control).AutoCompleteSource = AutoCompleteSource.ListItems;
            ((ComboBox)e.Control).AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;
        }

}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • C#Winforms组合框动态自动完成(C# winforms combobox dynamic autocomplete)
    问题 我的问题与此相似:如何动态更改C#组合框或文本框中的自动完成条目? 但是我仍然没有找到解决方案。 问题简述: 我有一个ComboBox和大量记录要显示在其中。 当用户开始键入时,我想加载以输入文本开头的记录,并为用户提供自动完成功能。 如上述主题中所述,我无法将它们加载到сomboBox_TextChanged因为我始终会覆盖以前的结果,并且永远不会看到它们。 我可以仅使用ComboBox吗? (不是TextBox或ListBox ) 我使用以下设置: сomboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend; сomboBox.AutoCompleteSource = AutoCompleteSource.CustomSource; 回答1 我最近也遇到了这类要求。我设置了以下属性,但未编写适用的代码。看看是否有帮助。 回答2 这是我的最终解决方案。 它可以处理大量数据。 我使用Timer来确保用户要查找当前值。 看起来很复杂,但事实并非如此。 感谢Max Lambertini的想法。 private bool _canUpdate = true; private bool _needUpdate = false; //If text has been changed then start timer //If
  • 如何在WPF页面加载的组合框中显示默认文本“ --Select Team-”?(How to display default text “--Select Team --” in combo box on pageload in WPF?)
    问题 在WPF应用程序中,在MVP应用程序中,我有一个组合框,用于显示从数据库中获取的数据。 在将项目添加到“组合”框中之前,我想显示默认文本,例如 “-选择团队-” 以便在页面加载时显示它,并在选择它时清除文本并显示项目。 正在从数据库中选择数据。 我需要显示默认文本,直到用户从组合框中选择一个项目。 请指导我 回答1 我发现最简单的方法是: <ComboBox Name="MyComboBox" IsEditable="True" IsReadOnly="True" Text="-- Select Team --" /> 您显然需要添加其他选项,但这可能是最简单的方法。 但是,此方法有一个缺点,即组合框内的文本不可编辑,但仍可以选择。 但是,鉴于我迄今为止发现的每个替代方案的质量和复杂性较差,这可能是最好的选择。 回答2 您可以通过使用IValueConverter来完成此操作,而无需任何代码。 <Grid> <ComboBox x:Name="comboBox1" ItemsSource="{Binding MyItemSource}" /> <TextBlock Visibility="{Binding SelectedItem, ElementName=comboBox1, Converter={StaticResource
  • 如何在NeatBeans IDE中增加字体大小?(How to increase font size in NeatBeans IDE?)
    问题 我刚买了一个很大的新显示器,在编辑器上阅读文字时遇到了很多麻烦。 我尝试通过通常的方法来增加字体大小,方法是: 工具>>选项>>字体和颜色>>单击字体>>旁边的“ ...”按钮,然后选择较大的字体 结果是:(单击以查看完整大小) 如您所见,光标变大了,但字体大小保持不变。 有谁知道有效增加NetBeans字体大小的另一种方法吗? 回答1 您可能还想更改IDE其他部分(而不是代码)的字体大小。 只需在启动命令中添加参数--fontsize <size> (默认大小为11)。 您可以在启动IDE时将其​​放入命令行中。 您也可以将其放入netbeans.conf文件,该文件位于NetBeans安装的/etc子目录中。 只需将其作为最后一个参数放入netbeans_default_options参数即可。 回答2 要增加netbeans 7.3.1和7.3的字体大小,请从菜单工具>>选项>>字体和颜色(是选项对话框窗口中的内部菜单)进入 在“语法”选项卡上的“类别:”列表框中的每个条目,您都会注意到该字体的值为“继承” 。 如果在“类别”列表框中找到名称为“默认”的条目并更改其字体值,则将影响编辑器的字体大小,因为所有内容均继承自“默认”条目。 另一种方法是通过组合键临时增加编辑器的字体。 要查找什么键,请通过“工具” >> “选项”转到“选项”对话框窗口,然后选择“键映射”菜单项
  • 在VBA的文本框中格式化MM / DD / YYYY日期(Formatting MM/DD/YYYY dates in textbox in VBA)
    问题 我正在寻找一种自动将VBA文本框中的日期格式设置为MM / DD / YYYY格式的方法,并且希望在用户键入时将其格式化。例如,一旦用户键入第二个数字,程序将自动键入“ /”。 现在,我使用以下代码进行了此工作(以及第二个破折号): Private Sub txtBoxBDayHim_Change() If txtBoxBDayHim.TextLength = 2 or txtBoxBDayHim.TextLength = 5 then txtBoxBDayHim.Text = txtBoxBDayHim.Text + "/" End Sub 现在,这在键入时效果很好。 但是,在尝试删除时,它仍会输入破折号,因此用户无法删除过去的破折号之一(删除破折号的长度为2或5,然后再次运行该子项,添加另一个破折号)。 关于更好的方法有什么建议吗? 回答1 我从不建议使用文本框或输入框来接受日期。 这么多事情都会出问题。 我什至不建议使用日历控件或日期选择器,因为您需要注册mscal.ocx或mscomct2.ocx,这很痛苦,因为它们不是可自由分发的文件。 这是我的建议。 您可以使用此定制日历来接受用户的日期 优点: 您不必担心用户输入错误的信息您不必担心用户将其粘贴到文本框中您不必担心编写任何主要代码精美的GUI 可以轻松地合并到您的应用程序中不使用您需要引用任何库的控件
  • 如何更改Jupyter启动文件夹(How to change the Jupyter start-up folder)
    问题 我尝试按照Jupyter Notebook文档中给出的说明进行操作。 不幸的是,我无法弄清楚。 “开始于”字段到底在哪里? 我有一个Windows 7(64位)系统,安装了Anaconda3(不在C驱动器中)。 我想更改Jupyter起始文件夹位置。 回答1 cd进入目录或父目录(将要嵌套的目标目录嵌套在其中)。 请注意,它必须是文件夹( E:\> ---这将不起作用) 然后只需运行命令jupyter notebook 回答2 使用jupyter笔记本配置文件: 打开cmd (或Anaconda Prompt )并运行jupyter notebook --generate-config 。 这会将文件写入C:\Users\username\.jupyter\jupyter_notebook_config.py 。 浏览到文件位置并在编辑器中将其打开 在文件中搜索以下行: #c.NotebookApp.notebook_dir = '' 替换为c.NotebookApp.notebook_dir = '/the/path/to/home/folder/' 确保在路径中使用正斜杠,并在主目录中使用/ home / user /而不是〜/,即使文件夹名称包含空格,也可以在双引号中使用反斜杠: "D:\yourUserName\Any Folder\More Folders\"
  • 自动完成文本框控件(AutoComplete TextBox Control)
    问题 我希望有一个文本框控件,该控件建议并附加带有C#2008和LINQ的Windows应用程序中数据库的值。 我用组合框来做,但是我不能用文本框来做。 我该怎么做? 回答1 这可能不是最好的处理方式,但应该可以: this.textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend; this.textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; private void textBox1_TextChanged(object sender, EventArgs e) { TextBox t = sender as TextBox; if (t != null) { //say you want to do a search when user types 3 or more chars if (t.Text.Length >= 3) { //SuggestStrings will have the logic to return array of strings either from cache/db string[] arr = SuggestStrings(t.Text); AutoCompleteStringCollection
  • 如何在Eclipse CDT中启用C ++ 11 / C ++ 0x支持?(How to enable C++11/C++0x support in Eclipse CDT?)
    问题 Eclipse 3.7.1 CDT 1.4.1 GCC 4.6.2 这是一段C ++ 11代码的示例: auto text = std::unique_ptr<char[]>(new char[len]); Eclipse编辑器抱怨: Function 'unique_ptr' could not be resolved Makefile编译正常。 如何使Eclipse停止抱怨此类错误? 回答1 我在Eclipse论坛中找到了这篇文章,只是遵循了这些步骤,它对我有用。 我在Windows上使用Cygwin设置使用Eclipse Indigo 20110615-0604。 制作一个新的C ++项目一切的默认选项创建完成后,右键单击该项目,然后转到“属性” C / C ++构建->设置->工具设置-> GCC C ++编译器->其他->其他标志。 将-std=c++0x (或对于较新的编译器版本-std=c++11放在最后。...代替GCC C ++编译器,我也有Cygwin编译器 C / C ++常规->路径和符号->符号-> GNU C ++。 单击“添加...”,然后将__GXX_EXPERIMENTAL_CXX0X__ (确保在两个下划线之前添加并加上下划线)粘贴到“名称”中,并将“值”留为空白。 按“应用”,执行要求您执行的所有操作,然后按“确定”。 现在
  • WORD技巧
    把文字替换成图片 首先把图片复制到 剪贴板中,然后打开替换对话框,在“查找内容”框中输入将被替换的文字,接着在 “替换为”框中输入“^c”(注意:输入的一定要是半角字符,c要小写),单击替换 即可。说明:“^c”的意思就是指令Word XP以剪贴板中的内容替换“查找内容”框中的内 容。按此原理,“^c”还可替换包括回车符在内的任何可以复制到剪贴板的可视内容,甚至Excel表格。 三招去掉页眉那条横线 1、在页眉中,在“格式”-“边框和底纹”中设置表格和边框为“无”,应用于“段落” 2、同上,只是把边框的颜色设置为白色(其实并没有删的,只是看起来没有了,呵呵) 3、在“样式”栏里把“页眉”换成“正文”就行了——强烈推荐! 会多出--(两个横杠) 这是用户不愿看到的,又要多出一步作删除-- 解决方法:替换时在前引号前加上一个空格 问题就解决了 插入日期和时间的快捷键 Alt+Shift+D:当前日期 Alt+Shift+T:当前时间 批量转换全角字符为半角字符 首先全选。然后“格式”→“更改大小写”,在对话框中先选中“半角”,确定即可 Word启动参数简介 单击“开始→运行”命令,然后输入Word所在路径及参数确定即可运行,如“C:\ PROGRAM FILES \MICROSOFT Office \Office 10\ WINWord.EXE /n”,这些常用的参数及功能如下: /n
  • 在Windows 7中更改命令提示符的默认启动目录(Changing default startup directory for command prompt in Windows 7)
    问题 如何在Windows 7中更改命令提示符的默认启动目录? 我通常会执行以下操作从C:\启动命令提示符 WIN-R (Run Prompt) cmd /K cd C:\ 我要执行以下操作以从C:\启动命令提示符 WIN-R (Run Prompt) cmd 回答1 在像Shinnok的答案一样向HKEY_CURRENT_USER\Software\Microsoft\Command Processor添加AutoRun条目的方式是,它也可能使事情弄乱,您确实应该尝试检测简单的cmd.exe启动与使用cmd的脚本/程序。 exe作为子进程: IF /I x"%COMSPEC%"==x%CMDCMDLINE% (cd /D c:\) 回答2 创建一个指向cmd.exe的快捷方式(例如桌面),然后右键单击副本并选择“属性”。 导航到“快捷方式”菜单,然后更改“开始于:”目录。 回答3 以下解决方案对我来说效果很好。 导航到开始菜单中的命令提示符快捷方式: C:\ Users \您的用户名\ AppData \ Roaming \ Microsoft \ Windows \开始菜单\程序\附件\命令提示符 右键单击快捷方式文件以打开属性对话框。 在“开始于:”文本框中,您应该看到%HOMEDRIVE %% HOMEPATH%。 如果您希望提示符从C:\开始,只需将变量替换为“ C:\”
  • 如何在Visual Studio代码(VSCode)中设置代码格式(How do you format code in Visual Studio Code (VSCode))
    问题 这个问题的答案是社区的努力。 编辑现有答案以改善此帖子。 它目前不接受新的答案或互动。 在Visual Studio中Windows上用于格式化或在Visual Studio代码编辑器中“美化”代码的等效于Ctrl + K + F和Ctrl + K + D ? 回答1 通过以下快捷方式,Visual Studio Code中提供了代码格式: 在Windows上Shift + Alt + F 在Mac上Shift + Option + F 在Linux上,按Ctrl + Shift + I 或者,您可以通过编辑器中提供的“命令面板”(使用Ctrl + Shift + P (在Mac上为Command + Shift + P ))找到快捷方式以及其他快捷方式,然后搜索格式文档。 对于未保存的片段 打开命令面板(Win:F1或Ctrt + Shift + P) 查找“更改语言模型” 选择语言,例如json 。 到现在为止,语法应突出显示。 格式化文档(例如,打开命令面板->'格式化文档') 取消格式化 选择文字命令面板->连接线 '显示图片' 回答2 代码格式化快捷方式: Windows上的Visual Studio代码-Shift + Alt + F Visual Studio代码在MacOS -按住Shift + Option + F Ubuntu上的Visual
  • Excel CSV-数字单元格格式(Excel CSV - Number cell format)
    问题 我将报告生成为CSV文件。 当我尝试在Excel中打开文件时,它会根据单元格的内容对数据类型进行假设,并相应地对其进行重新格式化。 例如,如果CSV文件包含 ...,005,... 然后,Excel将其显示为5。是否有方法可以覆盖它并显示005? 我希望对文件本身做一些事情,以便用户可以双击CSV文件将其打开。 我使用Excel 2003。 回答1 打开.csv文件时,没有一种简单的方法可以控制Excel应用的格式。 但是,下面列出的三种方法可能会有所帮助。 我的首选是第一选择。 选项1 –更改文件中的数据 您可以按如下方式更改.csv文件中的数据..., =“ 005” ,...这将在Excel中显示为..., 005 ,... Excel会将数据保留为公式,但是复制列并使用粘贴特殊值将摆脱公式,但保留格式 选项2 –格式化数据 如果仅是格式问题,并且该列中的所有数据长度均为三位数。 然后在Excel中打开数据,然后使用此自定义格式000格式化包含数据的列 选项3 –将文件扩展名更改为.dif(数据交换格式) 更改文件扩展名,然后使用文件导入向导来控制格式。 双击后,具有.dif扩展名的文件将由Excel自动打开。 一步步: 将文件扩展名从.csv更改为.dif 双击文件以在Excel中打开它。 “文件导入向导”将启动。 将“文件类型”设置为“定界”,然后单击“下一步”按钮
  • 禁用将文本粘贴到HTML表单中(Disable pasting text into HTML form)
    问题 有没有一种方法可以使用JavaScript禁用将文本粘贴到HTML表单上的文本字段的功能? 例如,我有一个简单的注册表格,要求用户输入两次电子邮件。 第二个电子邮件条目是为了验证第一个电子邮件条目中没有错别字。 但是,如果用户复制/粘贴他们的电子邮件,那么就无法达到目的,并且我一直在遇到用户的问题,因为他们输入了错误的电子邮件并复制/粘贴了它。 也许我不清楚我的问题,但我并没有试图阻止人们在他们的浏览器中复制(或拖动选择)文本。 我只是想阻止他们将输入粘贴到文本字段中,以最大程度地减少用户错误。 也许您可以使用另一种解决方案来解决我要在此处解决的核心问题,而不是使用此“ hack”? 我已经完成了不到六个用户测试,而且已经发生了两次。 我的听众没有很高的计算机水平。 回答1 最近,我不得不禁止在表单元素中粘贴。 为此,我编写了Internet Explorer(及其他)onpaste事件处理程序的跨浏览器*实现。 我的解决方案必须独立于任何第三方JavaScript库。 这是我想出的。 它并没有完全禁止粘贴(例如,用户一次可以粘贴一个字符),但是它满足了我的需求,避免了必须处理keyCodes等。 // Register onpaste on inputs and textareas in browsers that don't // natively support it
  • C#自动完成(C# AutoComplete)
    问题 我试图将自动完成功能添加到文本框中,结果来自数据库。 它们以以下格式出现 [001]最后,第一中 当前,您必须键入[001] ...才能显示条目。 所以问题是即使我先输入名字也要完成它。 所以如果一个条目是 [001]史密斯,约翰D 如果我开始输入John,则该条目应显示在自动完成的结果中。 目前的代码看起来像 AutoCompleteStringCollection acsc = new AutoCompleteStringCollection(); txtBox1.AutoCompleteCustomSource = acsc; txtBox1.AutoCompleteMode = AutoCompleteMode.Suggest; txtBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; .... if (results.Rows.Count > 0) for (int i = 0; i < results.Rows.Count && i < 10; i++) { row = results.Rows[i]; acsc.Add(row["Details"].ToString()); } } 结果是包含查询结果的数据集 该查询是使用like语句的简单搜索查询。 如果我们不使用自动完成功能
  • 如何在自动版式iOS中动态更改字体大小?(How to dynamically change the font size in auto layout iOS?)
    问题 我想在UILabel放置文本,但是对于不同的iPhone, UILabel的大小正在更改,因为我使用的是自动布局,但是我无法固定字体大小,因此我的文本被删去了。 有什么办法可以设置约束,以使文本动态地适合UILabel ? 看到这里由于不同的屏幕分辨率,文本被剪切了 回答1 您应该使用autoshrink 。 由于所有iPhone在纵向模式下都具有相同的Compact width尺寸类别,因此您不能依靠它来处理标签尺寸。 预览适用于iPhone5,iPhone6和iPhone 6+ 在检查器中,必须在“自动收缩”前面选择最小字体比例或最小字体大小。 这使内容可以更改字体大小以适合标签。 在这里,我将最小字体比例设置为0.5,因此最小尺寸是当前尺寸(31.0)的一半。 文本将尝试适应,直到达到最小比例/大小。 (通常不要为此目的使用“拉紧字母间距”。拉紧字母间距使用相同的字体大小并减小字母之间的间距。这可以使标签在截断之前拉紧最多5%,但在最小字体比例/下无效)大小已启用。) 您可能需要在iPad Pro等宽屏设备上进行测试,而在iPhone 4S等较小的屏幕上进行测试。 作为一种好习惯,您应该使用不同的用户系统字体大小进行测试,可以在Settings >“ General >“ Accessibility >“ Larger Text中进行Settings 。
  • Android的工作室 - 如何改变Android的SDK路径(Android Studio - How to Change Android SDK Path)
    问题 当我从Android Studio打开Android SDK Manager时,显示的SDK路径为: \android-studio\sdk 我想改变这条路。 我该怎么做? 回答1 从Android Studio 1.0.1开始 去 文件->项目结构到项目结构左-> SDK位置 SDK位置选择Android SDK位置(旧版本使用按+,添加另一个SDK) 回答2 对于项目默认值: 关闭当前项目(文件->关闭项目) 您将看到“欢迎使用Android Studio对话框”。 在那里面: 单击配置->项目默认设置->项目结构单击左栏中的SDK位置在“ Android SDK位置”字段中输入Android SDK的路径。 (示例SDK位置: C:\android-sdk ;我在C:\android-sdk下有子文件夹,如add-ons , platforms等) 单击确定保存更改玩得开心! 以下步骤适用于旧版本(<1.0)的Android Studio 在中间列中,单击Android SDK(带有Android图标),或者,如果没有看到带有Android图标的条目,请单击顶部的+。 更改SDK主页路径,然后选择有效的目标。 回答3 在快速启动窗口中,选择“配置”,然后选择“项目默认值”,然后选择“项目结构”。 然后在“平台设置”下的左侧,选择“ SDK”。
  • 如何在Xcode编辑器中增加字体大小?(How to increase font size in the Xcode editor?)
    问题 在Xcode中增加字体大小是很痛苦的。 回答1 对于Xcode 4.1 仍然是一个巨大的痛苦。 不良的UI设计(但是我的思维方式似乎与使100多个字符变量和方法名称的软件工程师的思维方式不匹配。我的抱怨足够了) 我将修改当前版本的上一篇文章。 关闭您在Xcode中打开的所有项目(否则打开项目时将无法访问“字体”窗口。) 转到XCode>首选项>字体和颜色从“主题”框中选择要修改的主题(或选择要修改的主题,然后单击主题列表底部的“ +”按钮以首先克隆它进行备份,因为没有撤消选项) 在源代码编辑器框中,提供了可以设置字体的文本类型列表:纯文本注释文档注释。 。 。 从源代码编辑器列表中选择任何一项或所有项目,该特定文本的字体名称和大小将显示在“源代码编辑器”窗口下方的“字体”窗口中。 (如果您碰巧不突出显示其中之一,则可以访问字体检查器并选择新的大小,但会想知道为什么未应用您所做的更改!) 在“字体”窗口中,单击字体名称和大小右侧的较小,几乎隐藏且设计不佳的“ T”图标。 瞧! 仅需14次击键,您就可以进入“字体检查器”窗口! 您现有的字体将在字体检查器中预先选择。 您现在所做的任何更改都将应用于在“源代码编辑器”窗口中选择的文本类型。 例如,所有字体> Menlo>常规> 14 关闭您在这次寻找圣杯时打开的窗户。 恭喜你您现在可以阅读您的代码了。 那不是很痛苦吗? 回答2
  • MobaXterm文档手册
    MobaXterm文档 1.一般 1.1。介绍 1.2。届会 1.3。多表环境 1.4。X11服务器 1.5。类Unix终端 1.6。内置图形工具 MobaXterm界面 2.1。不同的整合模式 标签界面 分割模式 分离标签功能 服务 SSH隧道(端口转发) 全局设置 会议经理 2.2。本地终端功能 打开命令 cygpath命令 /驱动器安装路径 / registry虚拟文件夹 //挂载点 执行本机Windows程序 其他有用的命令 2.3。网络实用程序 远端运算 显示设置 文件传输 网络监控 2.4。其他实用程序 编者 各种各样的 外挂程式 MobApt软件包管理器 3.全局设置 3.1。“常规”标签设置 永久主目录 默认文本编辑器程序 Windows文件夹上的右键单击菜单 MobaXterm密码管理 MobaXterm键盘快捷键 管理我的共享会话 永久根(/)目录 3.2。“端子”选项卡设置 定制 字形 字符集 显示分隔线 使用Windows PATH环境 右键单击粘贴 退格键发送^ H 在航站楼出口显示确认 显示滚动条 跟踪终端活动 粘贴多行之前警告 将终端输出记录到以下目录 自定义语法突出显示定义 3.3。“ X11”标签设置 引擎 键盘 Unix兼容键盘 在MobaXterm启动时自动启动X服务器 在监视器上运行 显示偏移 剪贴板 Xorg版本 OpenGL加速
  • Eclipse的隐藏功能(Hidden features of Eclipse [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 已锁定。 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 好吧,这可能是一个la脚的问题,但是每个人使用这些东西的方式都不一样。 该IDE最好的省时方法是什么? 汤姆 回答1 不要忘记Ctrl + Shift + L ,它会显示所有键盘快捷键组合的列表(以防万一您忘记了此处列出的任何快捷键)。 回答2 Ctrl-2的东西 似乎没有人提到Ctrl-2 L(分配给新的本地变量)和Ctrl-2 F(分配给新字段),这些都改变了我编写代码的方式。 以前,我输入的内容是(|是光标位置): Display display = new | 然后我按Ctrl-Space完成构造函数调用。 现在我输入: new Display()| 然后按Ctrl-2 L,结果为: Display display = new Display()| 这确实加快了速度。 (Ctrl-2 F的作用相同,但分配给新字段而不是新变量。) 另一个不错的快捷方式是Ctrl-2 R:在文件中重命名。 重命名局部变量之类的文件时,它比重命名重构
  • C#-如何防止组合框中的鼠标滚轮滚动?(C# - how do I prevent mousewheel-scrolling in my combobox?)
    问题 我有一个组合框,我想防止用户使用鼠标滚轮滚动浏览项目。 有没有简单的方法可以做到这一点? (C#,VS2008) 回答1 对ComboBox使用MouseWheel事件: void comboBox1_MouseWheel(object sender, MouseEventArgs e) { ((HandledMouseEventArgs)e).Handled = true; } 注意:您必须在代码中创建事件: comboBox1.MouseWheel += new MouseEventHandler(comboBox1_MouseWheel); 回答2 对于WPF,请改为处理PreviewMouseWheel事件。 考虑ComboBox.IsDropDownOpen也是一个好主意,以便在扩展ComboBox时如果选择中有很多项目,用户仍可以使用鼠标滚动。 另一件事是在整个应用程序中应用相同的行为。 我通常使用以下代码来完成以上所有操作: App.xaml <Application.Resources> <Style TargetType="ComboBox"> <EventSetter Event="PreviewMouseWheel" Handler="ComboBox_PreviewMouseWheel" /> </Style> </Application
  • 如何从UILabel的第n行获取文本/字符串?(How to get text / String from nth line of UILabel?)
    问题 有没有一种简单的方法可以从UILabel中的给定行中获取(或简单地显示)文本? 我的UILabel正确地显示了我的文本并将其布置得漂亮,但偶尔我需要能够仅显示某些行,但是显然我需要知道UILabel如何放置所有内容来做到这一点。 我知道可以使用子字符串轻松完成此操作,但是我需要知道该行的起点和终点。 或者,如果UILabel的框架存在某种偏移,则可以滚动UILabel,并隐藏我不想看到的其余内容。 我还没有发现任何可以轻松完成此操作的东西。 有人有什么好主意吗? 谢谢 伊法 回答1 我认为没有做到这一点的本地方法(例如“ takethenline”方法)。 我可以找出一个棘手的解决方案,但不确定是否是最佳解决方案。 您可以将标签分成单词数组。 然后,您可以循环数组并检查文本高度,直到像这样的单词: NSString *texttocheck; float old_height = 0; int linenumber = 0; for (x=0; x<[wordarray lenght]; x++) { texttocheck = [NSString stringWithFormat:@"%@ %@", texttocheck, [wordarray objectAtIndex:x]]; float height = [text sizeWithFont:textLabel