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

Posted

技术标签:

【中文标题】更改 GridViewComboboxColumn 中的选定项目(Telerik,winforms)【英文标题】:Changing selected item in 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 是正确的位置(我怀疑)?

【问题讨论】:

【参考方案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 作为分隔符,以便不会将任何内容添加到自动完成框中的选定字符串中。 虽然这也使得所有选择的元素都被树化为一个单独的标签。

【讨论】:

以上是关于更改 GridViewComboboxColumn 中的选定项目(Telerik,winforms)的主要内容,如果未能解决你的问题,请参考以下文章

如何根据第一个 GridViewComboBoxColumn 的选择填充第二个列

HAC 集群更改 IP(单节点更改全部节点更改)

更改fancybox iframe的大小-我可以更改宽度但不能更改高度?

在运行时更改方向更改 ViewControllers

UIScrollView 更改 contentOffset 时更改框架

HAC集群更改IP(单节点更改全部节点更改)