更改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是正确的位置(我怀疑)?
这个问题本身的一个可能的解决方案是放弃使用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作为分隔符,这样就不会向自动完成框中的选定字符串添加任何内容。虽然这也使得所有选定的元素被视为一个标签