【问题标题】:XtraGrd.GetRow(XtraGrd.FocusedRowHandle) doesn't get the value of the focused TextBoxXtraGrd.GetRow(XtraGrd.FocusedRowHandle) 没有获得焦点文本框的值
【发布时间】:2016-11-02 06:30:08
【问题描述】:

在我的WinForm 应用程序中,当我想在xtragrid 中添加一行时,我无法获取focused textbox 的当前值。

假设我有一个 textBox 绑定到 Model.VchType.Title ,在我点击保存按钮之前,我的 焦点 位于 txtTitle 上,我在上面输入了“title1”。

这是我保存按钮事件的代码:

Model.VchType row = xtraGrd.GetRow(xtraGrd.FocusedRowHandle) as Model.VchType;

row.Title 在到达这行代码的断点后,我得到了null。 只有在我点击保存按钮 focus 位于 txtTitle 之前,才会出现此问题。

-------- 更新 ------------

这是模型的一些代码:

[System.ComponentModel.DataAnnotations.Schema.Table("vwVchType", Schema = "Sle")]
[Serializable]
public class VchType : Entity
{
    private int _ID;
    [System.ComponentModel.DataAnnotations.Schema.Column]
    [RnDisplayName(typeof(Rnw.Sle.Properties.Resources), "ID")]
    public override int ID
    {
        get
        {
            return _ID;
        }
        set
        {
            _ID = value;
        }
    }

    private string _Title;
    [System.ComponentModel.DataAnnotations.Schema.Column]
    [RnDisplayName(typeof(Rnw.Sle.Properties.Resources), "Title")]        
    public string Title
    {
        get
        {
            return _Title;
        }
        set
        {
            _Title = value;
        }
    }
}

我还创建了 designer 的专栏。

我填写了bindingSource 并将网格的datasource 的属性设置为设计器中的此绑定源。

而且我不认为问题出在列名上,因为如果在我点击保存按钮之前我将注意力集中在另一个控制器上,它可以正常工作并且我得到 row.Title 的价值。

【问题讨论】:

  • 文本框是网格中的存储项吗?还是文本框脱离了 GridComponent?
  • @Sebi 它是网格中的存储库项
  • 请在保存数据之前尝试将焦点设置在任何其他对象上。它不是那么干净,但我有一些项目对此很有帮助。因此,您保存方法中的第一个操作是将焦点设置为任何标签或某事。出格。
  • 你试过this吗?
  • @Sebi 我试图将焦点放在另一个标签上,但没有成功

标签: c# winforms devexpress xtragrid


【解决方案1】:

你需要打电话

((GridView)xtraGrid.FocusedView).PostEditor();

gridView.PostEditor()this 会将当前值保存到编辑器EditValue。 然后您需要调用view.UpdateCurrentRow() 来验证焦点行并将其值保存到数据源。

所以你需要这样的东西

((GridView)xtraGrid.FocusedView).PostEditor();
((GridView)xtraGrid.FocusedView).UpdateCurrentRow();
Model.VchType row = xtraGrd.GetRow(xtraGrd.FocusedRowHandle) as Model.VchType;

【讨论】:

  • 感谢您的回答,我使用了 gridView.PostEditor() ,但问题没有解决。 row.Title 仍然为空
  • gridView.FocusedView.PostEditor(); ,它说 gridView 不包含 FocusedView 的定义。所以我改用 gridView.PostEditor() 。但没有解决问题。
  • 您能否发布更多代码。尤其是模特。
  • 编辑您的问题并添加用于模型的代码以及如何将其设置到网格的数据源。此外,如果您“手动”或使用设计器创建了列,请确保列的 FieldName 为“Title”,列的 FieldName 必须与模型类的属性名称匹配。如果您使用 C# >= 5 colTitle.FieldName = nameof(VchType.Title),则可以使用 nameof 运算符
  • 另外 FocusedView 是网格本身的属性而不是视图,这就是你得到编译错误的原因。
【解决方案2】:

您可以在保存数据之前聚焦另一个表单对象。所以调用:

anyControl.Select();

在您保存之前。这将从您的文本框中关闭打开的编辑器并将更改发布到您的数据源。通常这应该由PostEditor(); 完成,这有时似乎缺乏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多