首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataGridView DataGridViewComboBoxCell值不变

DataGridView DataGridViewComboBoxCell值不变
EN

Stack Overflow用户
提问于 2015-05-19 21:57:00
回答 1查看 676关注 0票数 0

我有一个数据行视图,行的一些单元格可能是一个组合框。我可以绑定combobox并且它可以正确初始化,但是当我从combobox中选择一个项时,控件的Value属性保持不变,但格式化后的值被更改为新的选定项。

下面是我如何将组合框加载到我的网格视图中:

代码语言:javascript
复制
private void ADDComboBoxItemToView(string itemName, Languages.LanguagesEnum language = Languages.LanguagesEnum.English)
{
    DataGridViewComboBoxCell c = new DataGridViewComboBoxCell();
    c.DataSource = LanguagesManager.LanguageNames.GetLanguages();
    c.ValueType = typeof(Languages.LanguagesEnum);
    c.Value = language;
    c.ValueMember = "LangID";
    c.DisplayMember = "LangName";
    c.FlatStyle = FlatStyle.System;


    var id = dgItems.Rows.Add(new object[] { filePath });
    dgItems.Rows[id].Cells[1] = c;
}

这是我的数据源类:

代码语言:javascript
复制
public class LanguageNames
{
    public Languages.LanguagesEnum LangID { get; set; }

    public int LangNum
    {
        get { return (int) LangID; }
    }

    public string LangName
    {
        get { return GetLanguageName(LangID); }
    }

    private string GetLanguageName(Languages.LanguagesEnum id)
    {
        switch (id)
        {
            case Languages.LanguagesEnum.English:
                return "English";
            case Languages.LanguagesEnum.Finnish:
                return "Finnish";
            case Languages.LanguagesEnum.French:
                return "French";
            default:
                return string.Empty;
        }
    }

    public static List<LanguageNames> GetLanguages()
    {
        return _languages;
    }

    private static readonly List<LanguageNames> _languages = new List<LanguageNames>
    {
            new LanguageNames{LangID = Languages.LanguagesEnum.English},
            new LanguageNames{LangID = Languages.LanguagesEnum.Finnish},
            new LanguageNames{LangID = Languages.LanguagesEnum.French}
    };
}

下面是我处理选择更改事件的方式:

代码语言:javascript
复制
private void dgItems_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    if (dgItems.CurrentCell.ColumnIndex == 1 && e.Control is ComboBox)
    {
        ComboBox comboBox = e.Control as ComboBox;
        comboBox.SelectedIndexChanged += LastColumnComboSelectionChanged;
    }
}

private void LastColumnComboSelectionChanged(object sender, EventArgs e)
{
    var currentcell = dgItems.CurrentCellAddress;
    DataGridViewTextBoxCell celItem = (DataGridViewTextBoxCell)dgItems.Rows[currentcell.Y].Cells[0];
    DataGridViewComboBoxCell celLang = (DataGridViewComboBoxCell)dgItems.Rows[currentcell.Y].Cells[1];

    var item = celItem.Value.ToString();
    var language = (Languages.LanguagesEnum) celLang.Value;

    _IsSaveRequired = true;
}

这里的问题是,无论我在组合框中的语言之间切换了多少次,celLang.Value总是返回English。但是,如果我调用celLang.FormattedValue,我会得到正确的语言字符串。

我真的需要将语言值作为枚举,不能从FormattedValue中获益。

如果我没有初始化组合框,移除c.Value = language;行,我在var language = (Languages.LanguagesEnum) celLang.Value;得到一个"object reference“异常,并且celLang.Value为空;

有谁能帮帮忙吗?

编辑:

这是语言枚举器:

代码语言:javascript
复制
public enum LanguagesEnum
{
    English,
    Finnish,
    French
}
EN

回答 1

Stack Overflow用户

发布于 2020-07-08 19:39:49

如果有人遇到同样的问题,请尝试将DataGridViewComboBoxColumn.DisplayStyle更改为ComboBox。默认值为DropDownButton。我遇到了同样的问题,在此更改之后,一切都正常工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30327773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档