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);
}