Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 此列表在我的代码中的哪一点<&燃气轮机;变空了? 命名空间消息 { 公共部分类电子邮件 { 列表附件=新列表(); 受保护的无效页面加载(对象发送方、事件参数e) { foreach(文档列表中的文档) { 附件.增加(文件); } } 受保护的无效BTN发送\单击(对象发送方,事件参数e) { 发送邮件(附件); } } }_C#_List_Clone_Shallow Copy - Fatal编程技术网

C# 此列表在我的代码中的哪一点<&燃气轮机;变空了? 命名空间消息 { 公共部分类电子邮件 { 列表附件=新列表(); 受保护的无效页面加载(对象发送方、事件参数e) { foreach(文档列表中的文档) { 附件.增加(文件); } } 受保护的无效BTN发送\单击(对象发送方,事件参数e) { 发送邮件(附件); } } }

C# 此列表在我的代码中的哪一点<&燃气轮机;变空了? 命名空间消息 { 公共部分类电子邮件 { 列表附件=新列表(); 受保护的无效页面加载(对象发送方、事件参数e) { foreach(文档列表中的文档) { 附件.增加(文件); } } 受保护的无效BTN发送\单击(对象发送方,事件参数e) { 发送邮件(附件); } } },c#,list,clone,shallow-copy,C#,List,Clone,Shallow Copy,您可以猜到,为了便于解释,我已经把这段代码删去了,但这就是我所做的一切。我有一种感觉,这与深度/浅层复制和克隆有关,如果是的话-有人能帮助解释一下这里发生了什么,以及我如何避免它/以不同的方式填充列表吗 非常感谢 丹 编辑:对不起,我在写“文档列表”的地方实际上是这样写的: namespace Messages { public partial class Email { List<Document> attachments = new List<

您可以猜到,为了便于解释,我已经把这段代码删去了,但这就是我所做的一切。我有一种感觉,这与深度/浅层复制和克隆有关,如果是的话-有人能帮助解释一下这里发生了什么,以及我如何避免它/以不同的方式填充列表吗

非常感谢

编辑:对不起,我在写“文档列表”的地方实际上是这样写的:

namespace Messages
{
    public partial class Email
    {
        List<Document> attachments = new List<Document>();

        protected void Page_Load(object sender, EventArgs e)
        {
            foreach(Document document in documentList)
            {
                attachments.Add(document);
            }
        }
        protected void btnSend_Click(object sender, EventArgs e)
        {
            sendMail(attachments);
        }
    }
}
(列表)会话[请求.查询字符串[“文档列表”]]

所以,它来自一个会话变量。使用断点,我可以看到附件列表填充得很好,但是当涉及到click事件处理程序时,它是空的!?不是null,只是count==0。

它变为空,因为它没有存储在ViewState中(我在这里根据方法名称假设asp.net webforms)

看到和

或者,将该值存储在会话中,请参见

EDIT2:有了额外的信息-我以前遇到过一些问题,这些问题已经通过将代码移出Page_load并移入助手方法(更好)来解决,并在事件回调中使用它。我最初确实声明事件回调在页面加载之前出现-但是我刚刚检查了这一点,它没有,但是我确信我过去遇到过一个问题,在某些情况下,对于子控件,页面加载没有完成-可能与验证有关

无论如何,它可能应该沿着以下行重新编码-以消除页面加载和附件之间的依赖性。使用IENumerables(而不是列表)也可以很简洁-参见最后一个示例

e、 g


但是,也值得建议使用LINQ这样做:

protected void btnSend_Click(object sender, EventArgs e)
{
    sendMail(getAttachments());
}
IEnumerable getAttachments()
{
返回((列表)会话[Request.QueryString[“documentList”]])。选择(doc=>doc);
}
受保护的无效BTN发送\单击(对象发送方,事件参数e)
{
sendMail(getAttachments());
//或者,如果sendMail不接受IEnumerable,请执行以下操作:
//sendMail(getAttachments().ToList());
}

谢谢你。注意:附件显然是调试时为空的列表。能否在add()调用中添加断点以确保“documentList”不为空?调试时,请尝试折叠附件列表,您可以看到值在某一点上发生了变化。您能解释一下documentList是如何填充的以及何时处于页面生命周期吗?您可能对代码进行了太多的剥离;-)我看不出有什么不对劲的地方(除了不知从哪里冒出来的文档列表)。所以问题一定出在我们看不到的地方。
List<Document> getAttachments()
{
    List<Document> attachments = new List<Document>();

    foreach(Document document in (List<Document>)Session[Request.QueryString["documentList"]])
            attachments.Add(document);
}
protected void btnSend_Click(object sender, EventArgs e)
{
    sendMail(getAttachments());
}
IEnumerable<Document> getAttachments()
{
    return ((List<Document>)Session[Request.QueryString["documentList"]]).Select(doc => doc);
}

protected void btnSend_Click(object sender, EventArgs e)
{
    sendMail(getAttachments());
    // or if sendMail doesn't accept IEnumerable then do :
    //sendMail(getAttachments().ToList());
}