【问题标题】:Changing selected item in GridViewComboboxColumn (Telerik, winforms)更改 GridViewComboboxColumn 中的选定项目(Telerik,winforms)
【发布时间】:2014-05-05 08:30:21
【问题描述】:

我想知道如何设置 gridviewcomboboxcolumn 的选定元素。

作为一个前言:我正在使用具有自动完成模式的列,以便 具有自动完成功能,但我也想向列表中添加新元素。 到目前为止,它工作顺利,除了一种情况:

我已经有了:

T1
T12
T123

在数据源中。

然后当我选择了例如 T12 并执行退格键来选择 T1 我遇到了需要手动单击列表中的 T1 的问题,因为没有选择 T1,因为显示了多种可能性。因此,当我离开编辑器模式而不手动选择 T1 时,我将 T12 作为选定项目。

我想改变这种行为,使第一个找到的项目被预先选择(总是)。 (不管是新元素还是改成元素可以这么说)

目前我已经为 cellendedit 添加了一个自定义处理程序,以将新值添加到列表中:

private void MainFormGridView_CellEndEdit(object Sender, GridViewCellEventArgs eventArgs)
{
    var virtualizedCurrentCell = ((Telerik.WinControls.UI.GridVirtualizedCellElement)(currentCell));
    var currentGridviewComboBoxColumn = ((Telerik.WinControls.UI.GridViewComboBoxColumn)(virtualizedCurrentCell.Data));
    if (((List<string>)currentGridviewComboBoxColumn.DataSource).IndexOf((string)currentCell.Value) > -1)
    {
        foundValueInList = true;
    }
    if (!foundValueInList)
    {
        ((List<string>)currentGridviewComboBoxColumn.DataSource).Add((string)currentCell.Value);
    }

}

列本身就是以这种方式创建的(在添加到 gridview 之前,它是其中的一部分:

GridViewComboBoxColumn newColumn;
newColumn = new GridViewComboBoxColumn();
((GridViewComboBoxColumn)newColumn).DataSource = (from c in entity.myOffer
                                                  orderby c.customer
                                                  where c.customer!= null
                                                  select c.customer)
                                                    .Distinct()
                                                    .ToList();
((GridViewComboBoxColumn)newColumn).DropDownStyle = Telerik.WinControls.RadDropDownStyle.DropDown;
((GridViewComboBoxColumn)newColumn).AutoCompleteMode = AutoCompleteMode.SuggestAppend; 
newColumn.FieldName = "customer";
newColumn.Name = "customer";
newColumn.HeaderText = "Customer";
newColumn.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
newColumn.Width = 100;
listOfColumns.Add(newColumn);
this.MainFormGridView.Columns.Add(newColumn);

所以问题是我可以做些什么来选择下拉列表中的特定项目,并且 CellEndEdit 是正确的位置(我怀疑)?

【问题讨论】:

    标签: c# winforms autocomplete telerik datagridviewcombobox


    【解决方案1】:

    问题本身的一个可能解决方案是放弃使用 GridViewComboboxcColumn 来获取具有自动完成功能的字段,而是使用“正常”的 GridViewTextBoxColumn。 除了此更改之外,我们还需要一个自定义编辑器来引入自动完成元素。这里需要注意的一件事是,如果您没有激活行可以自动增大大小的设置,则单元格的高度会略有变化,导致字符被切掉一点(因此,如果不是这种情况,那么您需要将行高增加到至少 30: 在这种情况下如何执行此操作的示例:MainFormGridView.TableElement.RowHeight = 30;)

    具有自动完成功能的文本框的创建代码现在更改为:

    GridViewTextBoxColumn newColumn;
    newColumn = new GridViewTextBoxColumn();
    newColumn.FieldName = "customer";
    newColumn.Name = "customer";
    newColumn.HeaderText = "Customer";
    newColumn.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
    newColumn.Width = 100;
    this.MainFormGridView.Columns.Add(newColumn);
    

    就像我之前提到的,我们现在需要一个用于自动完成框本身的自定义编辑器:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Telerik.WinControls.UI;
    
    namespace MyProject
    {
        class customAutoCompleteBox : RadTextBoxControlEditor
        {
            protected override Telerik.WinControls.RadElement CreateEditorElement()
            {
                return new RadAutoCompleteBoxElement();
            }
    
            public override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
            {
                RadAutoCompleteBoxElement element = this.EditorElement as RadAutoCompleteBoxElement;
                if (element.IsAutoCompleteDropDownOpen)
                {
                    return;
                }
                base.OnKeyDown(e);
            }
    
        }
    }
    

    完成后,我们只需要再执行 2 个步骤即可让新的自动完成框发挥作用: 1.) 设置 EditorRequired 和 CellEditorInitialized 事件 2.) 编写这些事件

    对于 1.) 这很容易做到:

        this.MainFormGridView.CellEditorInitialized += MainFormGridView_CellEditorInitialized;
        this.MainFormGridView.EditorRequired += MainFormGridView_EditorRequired;
    

    对于 2.) 这里的代码也很容易实现。虽然我会在这里放一点前言: element.Delimiter 可能会导致一些问题。默认情况下,人们会在那里使用 ' ' 作为分隔符, 但是,如果数据本身内部有很多空白,可能会引发意外行为,例如 每个空白分隔的数据部分都被视为一个“标签”或自动完成元素。 Thus when the row is chosen you can get multiple tags displayed that you can delete one by one.在我的情况下,这是不需要的,因此我没有使用 ' ' 作为分隔符,而是使用 '\t',因为数据内部没有标签。

    这是 CellEditorInitialized 的代码:

    void MainFormGridView_CellEditorInitialized(object sender, GridViewCellEventArgs e)
    {
                if (e.ActiveEditor is customAutoCompleteBox)
                {
                    customAutoCompleteBox editor = (customAutoCompleteBox)e.ActiveEditor;
                    RadAutoCompleteBoxElement element = (RadAutoCompleteBoxElement)editor.EditorElement;
                    element.Delimiter = '\t';
                    element.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                    element.AutoCompleteDisplayMember = e.Column.Name;
                    element.AutoCompleteValueMember = e.Column.Name;
                    element.AutoCompleteDataSource = (from c in entity.myOffer
                                                      orderby c.customer
                                                      where c.customer!= null
                                                      select c.customer)
                                                        .Distinct()
                                                        .ToList();
                }
    }
    

    现在是 ViewCellFormatting

    void MainFormGridView_EditorRequired(object sender, Telerik.WinControls.UI.EditorRequiredEventArgs e)
    {
            if (MainFormGridView.CurrentColumn.Name == "customer")
            {
                e.Editor = new customAutoCompleteBox();
            }
    }
    

    在没有出现原始问题的情况下,可以自动完成。这里唯一不太好的事情是必须按两次回车(在第一次“标签”从所选行显示之后,只有第二次回车设置标签。使用 TAB 移出也是如此细胞)。此外,组合框仅在输入字符后才显示,而不是从头开始显示。

    总体而言,此解决方案有效,但自动完成框的行为(和外观)与原始组合框 - 自动完成框略有不同。

    编辑: 看起来如果您使用分隔符,它会在末尾添加分隔符,如果自动完成框显示在过滤器中,这可能会导致不需要的结果(因此找不到任何结果)。一种可能的解决方案是使用 \0 作为分隔符,以便不会将任何内容添加到自动完成框中的选定字符串中。 虽然这也使得所有选择的元素都被树化为一个单独的标签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      • 2018-09-01
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 2021-12-20
      相关资源
      最近更新 更多