更改 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 的选择填充第二个列
更改fancybox iframe的大小-我可以更改宽度但不能更改高度?