我有一个消息框,用于在数据库中显示一些文本和数据(如果存在)。当前问题试图显示空值并尝试转换为ShortDate。我采取了两种方法,但没有一种方法可以按照我需要的方式工作。
第一种方法在字符串中使用三元连接,但它表现得非常奇怪。
DialogResult DuplicateMessage = MessageBox.Show("A contact name " + DuplicateName.Forename + " " + DuplicateName.Surname + " already exists within the System."
+ "\n Existing Client: " + DuplicateName.Forename + " " + DuplicateName.Surname
+ "\n Date of Birth: " + DuplicateName.DOB != null ? Convert.ToDateTime(DuplicateName.DOB).ToString("yyyy-mm-dd") : " ",
,"Possible Duplicate Client", MessageBoxButtons.YesNo);
目前,消息框仅显示换行符和出生日期。甚至没有文字“出生日期”
如果我删除第三和转换,只需
DialogResult DuplicateMessage = MessageBox.Show("A contact name " + DuplicateName.Forename + " " + DuplicateName.Surname + " already exists within the System."
+ "\n Existing Client: " + DuplicateName.Forename + " " + DuplicateName.Surname
+ "\n Date of Birth: " + DuplicateName.DOB
,"Possible Duplicate Client", MessageBoxButtons.YesNo);
这有效,可以显示一切。唯一的问题是出生日期格式错误。想知道如何制作它,所以日期是短日期格式,并将显示所有内容。
'DuplicateName'的所有属性都可以为空,
答案 0 :(得分:2)
我怀疑这是使用条件运算符的运算符优先级的问题。它可能包括字符串连接作为被测试条件的一部分,而不是作为结果的一部分。您可以使用括号明确地包含该运算符的元素,以标识哪些字符串属于哪些字符串,哪些字符串不属于:
"\n Date of Birth: " + (DuplicateName.DOB != null ? Convert.ToDateTime(DuplicateName.DOB).ToString("yyyy-mm-dd") : " ")
此外,如果DOB
是DateTime?
,那么您可以稍微简化一下代码:
"\n Date of Birth: " + (DuplicateName.DOB.HasValue ? DuplicateName.DOB.Value.ToString("yyyy-mm-dd") : " ")
无需在Convert
类型上使用Nullable<T>
,您可以更轻松(并且安全地)使用HasValue
和Value
属性。
答案 1 :(得分:1)
您可以使用另一对括号来修复它:
(DuplicateName.DOB != null ? Convert.ToDateTime(DuplicateName.DOB))
在第一种情况下,您将一个巨大的字符串连接在一起(因为您不使用任何括号),然后对null
进行测试。它等同于:
var stringToTest = "A contact name " + DuplicateName.Forename + " " + DuplicateName.Surname + " already exists within the System."
+ "\n Existing Client: " + DuplicateName.Forename + " " + DuplicateName.Surname
+ "\n Date of Birth: " + DuplicateName.DOB;
DialogResult DuplicateMessage =
MessageBox.Show(stringToTest != null ? Convert.ToDateTime(DuplicateName.DOB).ToString("yyyy-mm-dd") : " ",
,"Possible Duplicate Client", MessageBoxButtons.YesNo);