我有几个动态文本框,每当文本框失去焦点时,我想将其文本值添加到列表中,并在文本框被清除时删除
<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"....
我哪里可能出错?
答案 0 :(得分:0)
您需要将代码更改为以下内容:
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匹配你更新评论,如果不匹配你总是添加另一个条目 - 所以你最终会有多个重复的条目。
您需要搜索列表&amp;只有在找不到条目时才添加,如果找到了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));
}