我有几个动态文本框,每当文本框失去焦点时,我想将其文本值添加到列表中,并在文本框被清除时删除
<TextBox LostFocus="comment_box_LostFocus" Name="comment_box" Tag="{x:Bind id}" Width="300"/>
现在在 c# 代码上
List<CommentModel> commentlist = new List<CommentModel>();
private void comment_box_LostFocus(object sender, RoutedEventArgs e)
{
var comenttext = ((TextBox)sender).Text; //this is okay
var commentid = ((TextBox)sender).Tag; //this is okay
if (String.IsNullOrEmpty(comenttext)) //incase user clears the textbox
{
for(var i=0; i< commentlist.Count; i++)
{
if(commentlist[i].id == (int)commentid)
{
var itemToRemove = commentlist.Single(r => r.id == (int)commentid);
commentlist.Remove(itemToRemove);
}
}
}
else //add new or update incase its a comment change
{
for (var i = 0; i < commentlist.Count; i++)
{
if ((commentlist[i].id) == ((int)commentid))
{
commentlist[i].comment = comenttext;
}
else
{
commentlist.Add(new CommentModel((int)commentid, (string)comenttext));
}
}
}
if (commentlist.Count == 0)
{
Debug.WriteLine("Comment list is empty adding initial comment");
if (!String.IsNullOrEmpty(comenttext))
{
//automatically add new
commentlist.Add(new CommentModel((int)commentid, (string)comenttext));
}
}
}
}
类 CommentModel 是
class CommentModel
{
public int id;
public string comment;
public CommentModel(int idval, string commentval)
{
this.id = idval;
this.comment = commentval;
}
}
每当我尝试
for(var i=0; i< commentlist.Count; i++)
{
Debug.WriteLine(commentlist[i].comment);
}
这是注释的双重重复
first entry: "test one", debug output "test one",
second entry :"no2", debug output :"test one", "no2"....
我哪里会出错?
您需要将代码更改为如下所示:
if (String.IsNullOrEmpty(comenttext)) //incase user clears the textbox
{
for (var i = 0; i < commentlist.Count; i++)
{
if (commentlist[i].id == (int)commentid)
{
var itemToRemove = commentlist.Single(r => r.id == (int)commentid);
commentlist.Remove(itemToRemove);
break;
}
}
}
else
{
bool found = false;
for (var i = 0; i < commentlist.Count; i++)
{
if ((commentlist[i].id) == ((int)commentid))
{
commentlist[i].comment = comenttext;
found = true;
break;
}
}
if (! found)
commentlist.Add(new CommentModel((int)commentid, (string)comenttext));
}
在您的原始代码中,您遍历列表中的每个元素,如果 id 匹配,则更新注释,如果不匹配,则始终添加另一个条目 - 因此最终会得到多个重复条目。
您需要搜索列表并仅在未找到条目时添加,如果找到 id,则您可以停止搜索列表。
同样,您可以在 if 子句中找到条目后退出循环,但在这种情况下,您只会浪费时间,因为您已经删除了 id 的条目
没有 for 循环的更短的 LINQ 解决方案可能是:
var itemInList = commentlist.Where(li => li.id == (int)commentid).FirstOrDefault();
if (String.IsNullOrEmpty(comenttext)) //incase user clears the textbox
{
if (itemInList != null)
commentlist.Remove(itemInList);
}
else //add new or update incase its a comment change
{
if (itemInList != null)
itemInList.comment = comenttext;
else
commentlist.Add(new CommentModel((int)commentid, comenttext));
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句