C# 格式化Windows窗体文本框显示

C# 格式化Windows窗体文本框显示,c#,winforms,data-binding,datatable,newline,C#,Winforms,Data Binding,Datatable,Newline,我正在使用一个BindingNavigator并将我的BindingSource绑定到一个文本框,它是一个数据表。我像这样填充数据表newRow[“Email”]=listItem[“User\u Email\u Primary\u 23x”]然后我将DataTable行绑定到我的文本框中,如下所示txtEmail.DataBinding.Add(“text”,bindingSource1,“Email”) 现在我遇到的问题是DataTable中的数据如下所示-> XXXXXXX@XXXX.co

我正在使用一个
BindingNavigator
并将我的
BindingSource
绑定到一个文本框,它是一个数据表。我像这样填充数据表
newRow[“Email”]=listItem[“User\u Email\u Primary\u 23x”]然后我将DataTable行绑定到我的文本框中,如下所示
txtEmail.DataBinding.Add(“text”,bindingSource1,“Email”)

现在我遇到的问题是DataTable中的数据如下所示->

XXXXXXX@XXXX.com; XXXXXX@XXXX.com; XXXXXXXXXX@XXX.com;
因此,当数据显示在winform的文本框中时,所有数据都会并排显示,并用分号分隔。我想做的是更新可视化显示,这样当DataTable中的电子邮件地址显示在文本框中时,每个电子邮件都会显示在彼此的顶部,并具有文本框“自动展开”,以便显示所有电子邮件。所以我想要的显示结果是

XXXXXXXXX@XXXXX.com;
XXXXXXXX@XXX.com;
XXXXXXXX@XXX.com;
如何格式化
txtEmail.DataBinding.Add…
行以所需格式显示

编辑-其他信息-
感谢@Fabio提供的评论-我得到了下面的语法,但我得到了2个编译错误

private void AddLineBreak(object sender, ConvertEventArgs cevent)
{
    string dtValue = cevent;
    var result = dtValue.Contains(";") ? string.Join("<br>", dtValue.Split(';')) : cevent;
}

public void BindData()
{
    Binding b = new Binding("Text", bindingSource1, "Email");
    b.Format += new ConvertEventHandler(AddLineBreak);
    txtEmail.DataBinding.Add(b);
}
无法将类型“System.Windows.Forms.ConvertEventArgs”隐式转换为字符串

第二个错误是在线路上

dtValue.Contains(";") ? string.Join("<br>", dtValue.Split(';')) : cevent;
dtValue.Contains(“;”)?string.Join(“
”,dtValue.Split(“;”):cevent;
提供错误的

无法确定条件表达式的类型,因为“字符串”和“System.Windows.Forms.ConvertEventArgs”之间没有隐式转换


我应该做些什么来避免这些编译错误?

参数
ConvertEventArgs cevent
是包含格式化值信息的对象。eventhandler将
cevent.Value
属性更新为所需值的目的

格式EventHandler是检查要转换为的类型的良好实践。在本例中,您将检查
.DesiredType
属性是否等于
字符串
类型

由于
cevent.Value
属于
object
类型,因此在执行任何操作之前,需要将其强制转换为原始类型

private void AddLineBreak(object sender, ConvertEventArgs cevent)
{
   if (cevent.DesiredType != typeof(string)) return;

   var originalValue = cevent.Value.ToString();   
   cevent.Value = originalValue.Replace(";", Environment.NewLine);
}

我认为
Replace
也能满足您的需要,而且看起来更容易理解。

对于格式化,您可以为
Binding.Format
事件定义一个处理程序。@Fabio->,但每次遇到分号时,我仍然不知道如何添加换行符。尝试使用
string.Split
Environment.NewLine
@Fabio-我的朋友让我更接近了一步,但我遇到了两个编译错误。请查看我的编辑并尝试提供帮助好吗?如果字段为空,这将引发错误。我应该包含在try/catch中并忽略错误吗?我尝试使用
if(cevent.DesiredType!=typeof(System.DBNull)){//从示例中执行上述操作}
@HotTomales,您可以使用
cevent.Value.ToString()
将原始值转换为字符串
DbNull.ToString()
将始终返回空字符串。我是否应该包含在try/catch中并忽略错误?-不要。仅当您希望/需要处理可能的异常时才使用
try..catch
。通常,如果您期望异常发生,那么它就不再是异常,应该作为逻辑的一部分进行处理。使用
try的好例子。。。catch
是连接错误或连续执行,即使引发异常,您也希望继续执行
private void AddLineBreak(object sender, ConvertEventArgs cevent)
{
   if (cevent.DesiredType != typeof(string)) return;

   var originalValue = cevent.Value.ToString();   
   cevent.Value = originalValue.Replace(";", Environment.NewLine);
}