【问题标题】:Dictionary and getting a ValueMember - "null" is returning basically the array string字典并获取 ValueMember - “null”基本上返回数组字符串
【发布时间】:2021-05-27 05:28:30
【问题描述】:

问题

对于 WinForms 应用程序,我需要显示一个带有 DisplayMember 和 ValueMember 的 ComboBox。 完成

当用户从 ComboBox 中选择时,存储在 ValueMember 中的值(在本例中为小数)应捕获到另一个文本框。 完成

但我还需要有一个“空”的第一个值,这样我就可以知道什么时候没有选定的值。这就是问题所在。

所以这里有一个代码 sn-p,出于隐私原因而通用。

Dictionary<string, string> Dogs = new Dictionary<string, string>();

Dog.Add("-", " "); 
Dog.Add("1", "German Shepard");
Dog.Add("2", "Pomeranian");
Dog.Add("3", "Terrier");

selDogs.DataSource = new BindingSource(Dogs, null)
seldogs.DisplayMember = "Value";
selDogs.ValueMember = "Key";

现在,如果在以后的代码中我要去

string myDog = selDogs.SelectedValue.ToString()

测试时,如果我选择德国牧羊犬,我会得到 1。这可行。

问题是,如果我需要进行数学运算,它不起作用。即使我尝试直接转换为小数或整数,它也会爆炸。

深入挖掘,这是因为 用户选择了任何东西之前,SelectedValue 返回的似乎是对象的字符串表示形式,即 "[-, 0]"。这意味着我无法编写任何数学程序,因为验证失败。

然后我添加了一个 if/then 来检查这种情况以排除它,这似乎有效。

我的问题是为什么我必须这样做,以及如何用简单的代码完成我想要的事情

  • 向用户显示一个带有显示值的组合框
  • ComboBox 将以空值开头,不应执行任何操作
  • 一旦用户更改为显示值,它应该获取 ValueMember 并对其进行处理 - 在这种情况下支持数学 - 但它不应该仅仅因为用户访问空行而轰炸或返回错误值李>

还有很多其他内容,但我认为其余部分是通过我的 if/then 调整来解决的,但我想了解 为什么 它返回数组的字符串表示形式以及为什么我可以'不仅仅是直接访问 ValueMember,即 selDogs.SelectedValue.GetValueAsString 或其他简单的东西。

【问题讨论】:

  • 什么类型的组合框? HTML?表格? WPF?这会影响答案。
  • WinForms - 抱歉
  • 空字符串为什么不用0或者负数呢?所以你应该只检查 value 是否
  • 这就是我所做的——我已经设置了 0,这就是它在字符串表示中显示的原因,如果我将下拉菜单从该行更改回来,它确实会正确返回 0,所以我知道设置正确。只是不是在表单第一次加载时。
  • @ReVeLaTeD: "SelectedValue 返回似乎是对象的字符串表示形式" 您可能处于代码中尚未运行 selDogs.ValueMember = "Key"; 的位置。例如,当您设置DataSource 时,您的事件处理程序可能会提前两行触发。解决此问题的一种方法是在所有设置完成后附加您的事件处理程序,而不是在 InitializeComponent() 中。

标签: c# winforms


【解决方案1】:

如果您希望将值作为整数使用,那么首先使用正确的类型就可以了。您可以使用不会用作空白值的任意数字,例如 0、-1 或 int.MinValue

根据您的用例,您可能还需要在首次绑定控件时手动设置未选择的值。

const int notSelected = int.MinValue;
Dictionary<int, string> Dogs = new Dictionary<string, string>();

Dog.Add(notSelected, " "); 
Dog.Add(1, "German Shepard");
Dog.Add(2, "Pomeranian");
Dog.Add(3, "Terrier");

selDogs.DataSource = new BindingSource(Dogs, null)
seldogs.DisplayMember = "Value";
selDogs.ValueMember = "Key";

//make sure you select the not selected value before accessing later,.
selDogs.SelectedValue = notSelected;

【讨论】:

  • 我将把它标记为答案,但这不是真正的直接解决方案——你指出了我改变类型的正确方向(我担心数据实际上可能是任何东西,通常更喜欢使用字符串,然后再进行转换,但在这种情况下它并不重要)。这否定了对 SelectedValue 的需求,因为最终我可以更好地控制键。谢谢。
【解决方案2】:

你必须像这样分配第一个值

Dog.Add("Select", "0"); 

和你的数据注释属性

[Range(1, 10, 
 ErrorMessage = "Pls select a dog")]
public int DogId {get; set;}

【讨论】:

    猜你喜欢
    • 2014-12-09
    • 2013-10-25
    • 2019-06-13
    • 2015-12-02
    • 2013-01-30
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多