【问题标题】:Update gridview inline with LINQ使用 LINQ 更新 gridview 内联
【发布时间】:2014-12-28 16:28:52
【问题描述】:

我正在尝试使用以下代码通过 LINQ 更新网格视图内联中名为“note”的记录。我的问题是当我运行它并尝试执行updNote_RowUpdating 时,我的项目崩溃了,指出var queryDetails 不包含任何元素。

查看oldValue变量可知其内容如下: "System.Collections.Specialized.OrderedDictionary+OrderedKeyValueCollection"

数据库由几个客户组成,他们分配了几个笔记,所有这些信息都存储在一个数据库中。

我的代码如下:

ASP.NET:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:GridView  ID="GridView1" runat="server" class=" table table-bordered table-striped" OnRowEditing="updNoteEdit_RowEditing" OnRowUpdating="updNote_RowUpdating" EnableViewState="false" AutoGenerateColumns="false">
               <Columns>
                <asp:TemplateField> 
                        <ItemTemplate> 
                          <asp:LinkButton ID="btnDeleteRec" runat="server" CausesValidation="False"  CommandName="select" Text="&times;"  class="close" ForeColor="red" OnClick="btn_delete_Click"></asp:LinkButton>
                          <asp:Label ID="lblNote" runat="server" Text='<%# Eval("Note") %>'></asp:Label>
                        </ItemTemplate>
                        <EditItemTemplate>
                            <asp:TextBox ID="txt_Note" runat="server" Text='<%# Eval("Note") %>'></asp:TextBox>
                        </EditItemTemplate>                    
                     </asp:TemplateField>
                   <asp:CommandField ShowEditButton="True" />
               </Columns>
            </asp:GridView>
        </ContentTemplate>
    </asp:UpdatePanel>

C#:

protected void updNote_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    tblBasic currentClient = new tblBasic();

    var oldValue = "" + e.OldValues.Values;
    var newValue = "" + e.NewValues.Values;

    var queryDetails = (from clients in entities.tblBasics
                            where clients.Note == oldValue
                            select new
                            {
                                clients.Note
                            }).First();

    foreach (var client in entities.tblBasics)
        {
            currentClient.Note = newValue;
        }
        entities.SaveChanges();

        GridView1.EditIndex = -1;
        DataBind();
}

任何帮助将不胜感激。

【问题讨论】:

  • @GrantWinney
    仅此系列中的一个。我打算只过滤我需要在 LINQ 语句中更改的注释,并更新那个注释。 oldValue 是用户看到并打算更改的注释,毕竟生成的文本框中只有一个字符串。

标签: c# asp.net linq gridview


【解决方案1】:

当你这样做时:

var oldValue = "" + e.OldValues.Values;

您实际上是在e.OldValues.Values 集合上调用ToString(),它始终返回集合的类名而不是其内容,并解释了您看到此内容的原因:

System.Collections.Specialized.OrderedDictionary+OrderedKeyValueCollection

您需要将e.OldValues.Values 中的所有值连接成一个字符串(可能与string.Join(),假设您尝试搜索所有 注释,或者您可以选择一个来自e.OldValues.Values 集合的注释以供搜索。


所以你的集合中的每个“值”都只是一个字符串,你想选择第一个匹配的。

尝试使用此 LINQ 选择您想要的注释:

var matchingNote = e.OldValues.Values.Cast<string>().Where(n => n == "note").First();

【讨论】:

  • 抱歉打扰了,从e.OldValues.Values 集合中选择单个笔记的语法是什么?
  • 内容只是一串文本,其中包含一个人的笔记(笔记对于某个客户的ID是唯一的)。如果两个音符相同,则只需第一个音符即可(暂时保持简单)。
  • 不幸的是,没有运气,我得到了同样的“序列不包含元素”错误。还有什么我可以尝试的吗?
猜你喜欢
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
相关资源
最近更新 更多