1

我有一个从 LINQ 查询中填充的 DataGridView。其中一列是 FK,因此我添加了一个 ComboBox 列来显示该字段,该字段显示正常。

我遇到的问题是它不会让我更改 ComboBox 的值,因为它就像它被锁定一样。我检查了 DGV 和 Column 的 ReadOnly 属性,两者都是错误的。

任何人都可以阐明我所缺少的东西吗?

填充 DGV 的代码如下:

    private void PopulateForm()
    {
        DBDataContext db = new DBDataContext();

        var eventTypes =
            from evt in db.EVENT_TYPEs
                .Where(a => a.Omit == false)
                .OrderBy(a => a.EventType)
            select new
            {
                EventTypeID = evt.EventTypeID,
                EventType = evt.EventType,
                UpdateToStatusID = evt.UpdateToStatusID,
                AttachmentAllowedYn = evt.AttachmentAllowedYn,
                AttachmentRequiredYn = evt.AttachmentRequiredYn,
                CommentRequiredYn = evt.CommentRequiredYn
            };

        var statuses =
            from sts in db.STATUS
                .Where(a => a.Omit == false)
            select new
            {
                StatusID = sts.StatusID,
                Status = sts.TechreqStatus
            };

        DataGridView dgv = this.dgvEventTypes;
        DataGridViewColumn col;

        dgv.AutoGenerateColumns = false;
        col = dgv.Columns[dgv.Columns.Add("EventTypeID", "EventTypeID")];
        col.DataPropertyName = "EventTypeID";

        col = dgv.Columns[dgv.Columns.Add("EventType", "Event Type")];
        col.DataPropertyName = "EventType";

        DataGridViewComboBoxColumn comboCol = new DataGridViewComboBoxColumn();
        comboCol.Name = "UpdateToStatusID";
        comboCol.HeaderText = "Update To Status";
        comboCol.DataPropertyName = "UpdateToStatusID";
        comboCol.DataSource = statuses;
        comboCol.ValueMember = "StatusID";
        comboCol.DisplayMember = "Status";
        dgv.Columns.Add(comboCol);

        col = dgv.Columns[dgv.Columns.Add("AttachmentAllowedYn", "Attachments Allowed Yn")];
        col.DataPropertyName = "AttachmentAllowedYn";

        col = dgv.Columns[dgv.Columns.Add("AttachmentRequiredYn", "Attachment Required Yn")];
        col.DataPropertyName = "AttachmentRequiredYn";

        col = dgv.Columns[dgv.Columns.Add("CommentRequiredYn", "Comment Required Yn")];
        col.DataPropertyName = "CommentRequiredYn";

        dgv.DataSource = eventTypes;

        db.Dispose();
    }

非常感谢

4

1 回答 1

5

我相信这是因为您使用的是匿名类型。在您的情况下,您可以使用原始类型(evt 和 sts 的类型)

var eventTypes = from evt in db.EVENT_TYPEs where !evt.Omit order by evt.EventType
                 select evt

var statuses = from sts in db.STATUS where !sts.Omit
               select sts

或者

创建一个 POCO 对象作为视图模型

var eventTypes = from evt in db.EVENT_TYPEs where !evt.Omit order by evt.EventType
                 select new EventTypesObject() {EventTypeID = evt.EventTypeID, ...}

var statuses = from sts in db.STATUS where !sts.Omit
               select new StatusObject() {StatusID = sts.StatusID, Status = sts.TechreqStatus}

如果需要双向绑定,这将更容易实现 INotifyPropertyChanging 和 INotifyPropertyChanged。

于 2012-11-23T14:55:12.240 回答