【问题标题】:"Both DataSource and DataSourceID are defined" error using ASP.NET GridView“DataSource 和 DataSourceID 均已定义”错误使用 ASP.NET GridView
【发布时间】:2010-09-21 03:23:44
【问题描述】:

“DataSource 和 DataSourceID 都在 'grdCommunication' 上定义。删除一个定义。”

我今天刚刚收到此错误,代码一直有效,直到今天下午我将最新版本发布到我们的服务器,它在本地和服务器上都因该错误而中断。我不使用“DataSourceID”,应用程序将数据库查询读入数据表并将数据表设置为 GridViews 上的数据源。我在 Visual Studio 中进行了搜索,搜索了整个解决方案,字符串“DataSourceID”甚至没有出现在整个解决方案的 1 行代码中。这是让我感到害怕的第一件事。

我认为它昨天一直在工作,所以我将代码恢复到昨天的构建。错误仍然存​​在。我一直在回溯构建,但问题仍然存在。我回去一个月了,我仍然遇到同样的错误。这个应用程序今天早上运行良好?确实没有代码更改,应用程序中的任何地方都没有在任何网格视图上设置 DataSourceID。有没有人见过这样的东西??

如果 DataSourceID 从未设置,我怎么能得到那个错误......并且“DataSourceID”这个词不在我的解决方案中?我只是在整个树上做了一个wingrep,对datasourceid 进行了不区分大小写的搜索......完全没有任何结果。这个词在整个应用程序中绝对没有。

    <asp:GridView ID="grdCommunication" runat="server" 
    Height="130px" Width="100%"
     AllowPaging="true" >
    ... standard grid view column setup here... 
    </asp:GridView>

// Code behind.. to set the datasource
  DataSet dsActivity = objCompany.GetActivityDetails();

  grdCommunication.DataSource = dsActivity;
  grdCommunication.DataBind();

// 更新:删除了一些令人困惑的注释。

【问题讨论】:

  • 我要感谢大家与我一起集思广益并解决该死的微软误导。谢谢你 tsilb...

标签: asp.net gridview


【解决方案1】:

试试这个:

DataSet dsActivity = objCompany.GetActivityDetails();
grdCommunication.DataSource = dsActivity.Tables[0];
grdCommunication.DataBind();

【讨论】:

  • 很抱歉 grdCommunication.DataMember 也已设置,我将其省略了。但我也确实尝试过这种方式。这不好。我现在正在从代码中删除该网格视图,只是为了让应用程序启动并运行。
  • 好的,那么当您绑定到 Table 而不是 DataSet 时,您会得到相同的结果吗?
  • 这就是问题所在,我使用“Activity”作为数据源名称,他们将其更改为“ACTIVITIES”同名,只有大写......现在......这表明它绝对是区分大小写.. 但给出的错误是一个完整的红鲱鱼。
【解决方案2】:

圣烟蝙蝠侠。表名已更改,导致我的数据源不好。但是在这种情况下,该错误消息没有任何意义。因此,从技术上讲,如果我按索引而不是按名称调用表,则 tsilb 的解决方案将起作用,因此我会将他的解决方案标记为正确。

阅读他的帖子后,我尝试了 dsActivity.Tables["Activities"] 而不是将数据集传递给 Datasource 并将表名传递给 Datamember,显然这不起作用,但如果我传递实际索引,我不喜欢这样做,因为该索引可能会改变,然后它现在正在工作。但搞砸的部分是那个错误。那个错误完全不符合问题所在。说我定义了两者并删除了一个,而实际上并非如此。另一个真正搞砸的事情是,表名只是改为全部大写......但是,“活动”是与“活动”不同的键。

【讨论】:

  • 如图所示,有时表名更改比索引更改更有可能...这可能仅在您的查询更改时才会发生...在这种情况下,您会本能地仔细检查代码运行它,对吗? :)
  • 是的,我想.. 我只是不喜欢改变.. :(
  • 没有人喜欢他们无法控制的事情发生变化。这就是为什么我们有诸如“我将采取行动项目来推回外部依赖”之类的术语。在我的世界里,这对人们来说实际上是有意义的。这让我恶心。
【解决方案3】:

在此 grdCommunication.DataSource = dsActivity; 之前替换此代码;

grdCommunication.DataBind();
grdCommunication.DataSourceID="";

【讨论】:

    【解决方案4】:

    tslib 是对的,不要这样做: grdCommunication.DataSourceID = null; 或 string.Empty 版本。如果您使用 SqlDataSource 或 ObjectDataSource 控件进行绑定,则仅使用 DataSourceID。

    之所以称为“声明式”绑定,是因为您使用的是页面上的“声明式”控件。绑定到控件不需要调用 DataBind() 方法。

    因为您是手动进行数据绑定(调用 grd.DataBind()),所以您只需设置 DataSourrce,然后调用 DataBind()。

    【讨论】:

    • 我刚做了那个因为我吓坏了。
    【解决方案5】:

    我遇到了同样的错误,但问题和解决方案完全不同。就我而言,我使用 LINQ to SQL 来填充一些下拉列表,然后缓存结果以供进一步的页面查看。清除缓存后一切都可以正常加载,然后在后续页面查看时会出错。

    if (Cache["countries"] != null)
    {
        lbCountries.Items.Clear();
        lbCountries.DataValueField = "Code";
        lbCountries.DataTextField = "Name";
        lbCountries.DataSource = (Cache["countries"]);
        lbCountries.DataBind();}
    else
    {
        var lstCountries = from Countries in db_read.Countries orderby Countries.Name select Countries;
        lbCountries.Items.Clear();
        lbCountries.DataValueField = "Code";
        lbCountries.DataTextField = "Name";
        lbCountries.DataSource = lstCountries.ToList();
        lbCountries.DataBind();
    
        Cache.Add("countries", lstCountries, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 240, 0), System.Web.Caching.CacheItemPriority.High, null);
    }
    

    问题来自: Cache.Add("countries", lstCountries, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 240, 0), System.Web.Caching.CacheItemPriority.High, null );

    应该是什么时候: Cache.Add("countries", lstCountries.ToList(), null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 240, 0), System.Web.Caching.CacheItemPriority .High, null);

    【讨论】:

      【解决方案6】:

      我今天遇到这个错误,原来它与 DataSourceID 无关,而与 DatasSource 本身有关。

      我的 DatasSource 有问题,我没有收到与 DatasSource 相关的错误,而是收到了这个无意义的错误。

      确保你的 DatasSource 是好的,这个错误应该会消失。

      【讨论】:

        【解决方案7】:

        始终将带有表索引的数据集绑定到 gridview...

        例如。 gridgrdCommunication.Table[0];正如上面提到的Tsilb

        你故意写的第二种方式..

        gridgrdCommunication.DataSourceID = String.Empty; gridgrdCommunication.DataSource=ds; gridgrdCommunication.DataBind();

        【讨论】:

          【解决方案8】:

          检查你的数据库结构......如果你正在访问你的数据抛出一个 dbml 文件,你数据库中的表结构与 dbml 文件结构不同

          【讨论】:

            【解决方案9】:

            如果您正在使用对象数据源并希望在后面的代码中有条件地重新加载网格,您可以成功地做到这一点:

            Dim datatable As DataTable = dataset.Tables(0)
            Dim dataSourceID As String = gvImageFiles.DataSourceID
            gvImageFiles.DataSourceID = Nothing
            gvImageFiles.DataSource = datatable.DefaultView
            gvImageFiles.DataBind()
            gvImageFiles.DataSource = Nothing
            gvImageFiles.DataSourceID = dataSourceID
            

            【讨论】:

              【解决方案10】:

              您需要选择一种方式来绑定网格 如果它来自后面的代码意味着使用 c# 代码,则从网格的设计视图中删除网格视图中的 datasourceid 属性 像这样

              //一定要这样

              【讨论】:

                【解决方案11】:

                请试试这个:

                gvCustomerInvoiceList.DataSourceID = ""; gvCustomerInvoiceList.DataSource = ci_data; gvCustomerInvoiceList.DataBind();

                【讨论】:

                  【解决方案12】:

                  我今天收到了这个错误。事实证明,我的存储过程既没有返回任何记录,也没有返回结构。这是因为我有一个空的 try catch 没有 raiserror

                  【讨论】:

                  • 虽然这可能是解决问题的宝贵提示,但一个好的答案也可以证明解决方案。请edit 提供示例代码来说明您的意思。或者,请考虑将其写为评论。
                  【解决方案13】:
                  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
                      Page.DataBind()
                  End Sub
                  Function GetData()
                      Dim dt As New DataTable
                      Try
                  
                          dt.Columns.Add("ROOM_ID", GetType(String))
                          dt.Columns.Add("SCHED_ID", GetType(String))
                          dt.Columns.Add("TIME_START", GetType(Date))
                          dt.Columns.Add("TIME_END", GetType(Date))
                  
                  
                          Dim dr As DataRow = dt.NewRow
                  
                          dr("ROOM_ID") = "Indocin"
                          dr("SCHED_ID") = "David"
                          dr("TIME_START") = "2018-01-03 09:00:00.000"
                          dr("TIME_END") = "2018-01-03 12:00:00.000"
                          dt.Rows.Add(dr)
                  
                  
                      Catch ex As Exception
                          MsgBox(ex.ToString)
                      End Try
                      Return dt
                  End Function
                  

                  并将其添加到您的项目 DataSource=""

                  【讨论】:

                    【解决方案14】:

                    在我的情况下,到数据库的连接字符串不起作用。修复连接字符串消除了这个错误。

                    【讨论】:

                      猜你喜欢
                      • 2011-06-15
                      • 2020-08-04
                      • 2014-04-10
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-10-28
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多