更改GridViewComboboxColumn (Telerik, winforms)中的选定项

本文关键字:winforms GridViewComboboxColumn Telerik 更改 | 更新日期: 2023-09-27 18:01:46

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

作为一点前言:我使用自动完成模式的列,以便有自动补全功能,但我还想向列表中添加新元素。到目前为止,它运行得很顺利,除了一个情况:

我已经有:

T1
T12
T123

在数据源。

然后当我选择T12并按退格键选择T1时我有问题,我需要手动点击列表中的T1,因为没有选择T1,因为有多种可能性显示。因此,当我离开编辑器模式而不手动选择T1时,我得到T12作为选中的项目。

我想以这样的方式改变这种行为,即第一个找到的项目是预先选择的(总是)。(不管它是一个新元素还是一个被修改过的元素)

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

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是正确的位置(我怀疑)?

更改GridViewComboboxColumn (Telerik, winforms)中的选定项

这个问题本身的一个可能的解决方案是放弃使用GridViewComboboxcColumn来获得一个自动完成的字段,而使用"正常"的GridViewTextBoxColumn。除了这个变化,我们还需要一个自定义的编辑器,它带来了自动完成元素。这里需要注意的一件事是,单元格的高度略有变化,导致字符被切掉一点,如果你没有设置活动,行可以自动增长的大小(因此,如果不是这种情况,那么你需要增加行高度至少30:在这种情况下如何做到这一点的例子:MainFormGridView.TableElement。)

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

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);
        }
    }
}

完成后,我们只需要再做两个步骤来让新的自动完成框起作用:1.) 设置EditorRequired和CellEditorInitialized事件2.) 写这些事件

对于1.)很容易做到:

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

对于2.),这里的代码也很容易实现。不过我要在这里做一点前言:元素。分隔符可能会导致一些问题。默认情况下会使用' '作为分隔符,但是,如果数据本身内部有许多空白,可能会引发意外行为,如每个空白分隔的数据部分被视为一个"标记"或自动完成元素。因此,当选择行时,可以显示多个标记,您可以逐个删除这些标记。在我的情况下,这是不需要的,因此我没有使用' '作为分隔符,而是使用''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();
        }
}

在没有出现原始问题的地方可以自动完成。这里唯一不太好的地方是必须按enter 2次(在第一次从选定的行显示"标签"之后,只有第二次输入设置标签)。使用TAB移出单元格也是如此)。此外,组合框只在输入字符后显示,而不是从一开始就显示。

总的来说,这个解决方案的功能,但自动完成框的行为(和外观)与原来的组合框-自动完成框略有不同。

编辑:如果您使用分隔符,它会在末尾添加分隔符,如果自动完成框显示在过滤器中,则可能导致不想要的结果(因此找不到任何内容)。一种可能的解决方案是使用'0作为分隔符,这样就不会向自动完成框中的选定字符串添加任何内容。虽然这也使得所有选定的元素被视为一个标签