我有一个数据行视图,行的一些单元格可能是一个组合框。我可以绑定combobox并且它可以正确初始化,但是当我从combobox中选择一个项时,控件的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,我会得到正确的语言字符串。
我真的需要将语言值作为枚举,不能从FormattedValue中获益。
如果我没有初始化组合框,移除c.Value = language;行,我在var language = (Languages.LanguagesEnum) celLang.Value;得到一个"object reference“异常,并且celLang.Value为空;
有谁能帮帮忙吗?
编辑:
这是语言枚举器:
public enum LanguagesEnum
{
English,
Finnish,
French
}发布于 2020-07-08 19:39:49
如果有人遇到同样的问题,请尝试将DataGridViewComboBoxColumn.DisplayStyle更改为ComboBox。默认值为DropDownButton。我遇到了同样的问题,在此更改之后,一切都正常工作。
https://stackoverflow.com/questions/30327773
复制相似问题