【问题标题】:DataGridView DataGridViewComboBoxCell value does not changeDataGridView DataGridViewComboBoxCell 值不变
【发布时间】:2015-05-19 13:56:59
【问题描述】:

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

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

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;
}

这是我的数据源类:

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}
    };
}

这就是我处理选择更改事件的方式:

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,我会得到正确的语言字符串。

我确实需要将语言值作为 Enum 并且无法从 FormattedValue 中受益。

如果我不初始化组合框,删除c.Value = language; 行,我在var language = (Languages.LanguagesEnum) celLang.Value; 处得到一个“对象引用”异常,celLang.Value 为空;

有人可以帮忙吗?

编辑:

这是语言枚举器:

public enum LanguagesEnum
{
    English,
    Finnish,
    French
}

【问题讨论】:

  • LastColumnComboSelectionChanged 似乎是一条无路可走的路。 itemlanguage 是实例化后不使用的局部变量。我可能读错了。
  • @FelixCastor 我会添加一些代码来反映language 的变化,但问题是celLang.Value 总是返回相同的值(它被初始化的那个)
  • 当您更改组合时是否调用过LastColumnComboSelectionChanged??
  • @TaW 是的,它被调用了。但值永远不会改变,只会改变格式化的值。
  • 只使用 FormattedValue 有什么问题?如果这在组合框更改后为您提供了您想要的价值,那么您为什么不能直接使用它呢?如果需要,将 FormattedValue 转换回您已建立的枚举。

标签: c# winforms datagridview combobox


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    相关资源
    最近更新 更多