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