Asp.net

DataBinding:“System.Data.DataRowView”不包含具有名稱的屬性

  • June 24, 2020

我收到了這個奇怪的錯誤……我的數據庫中的主鍵是“DocumentID”,所以我知道這不是問題所在。我正在嘗試讓選擇、編輯和刪除 gridview 按鈕工作,但我需要正確設置數據鍵名,以便它們可以使用。有任何想法嗎?

<asp:GridView ID="GridView1" runat="server" DataSourceID="sdsDocuments" EnableModelValidation="True"
       SelectedIndex="0" OnSelectedIndexChanged="GridView1_SelectedIndexChanged" DataKeyNames="DocumentID, DocumentTitle, DocumentBody">
       <Columns>
           <asp:BoundField DataField="DocumentID" HeaderText="DocumentID" ReadOnly="True" SortExpression="ID" />
           <asp:BoundField DataField="DocumentTitle" HeaderText="DocumentTitle" SortExpression="Title" />
           <asp:BoundField DataField="DocumentBody" HeaderText="DocumentBody" SortExpression="Body" />
           <asp:CommandField ShowSelectButton="True" ShowDeleteButton="True" />
       </Columns>
   </asp:GridView>
   <asp:SqlDataSource ID="sdsDocuments" runat="server" ConnectionString="<%$ ConnectionStrings:blcDocumentationConnectionString %>"
       SelectCommand="SELECT [DocumentTitle], [DocumentBody] FROM [tblDocument]" />

這是堆棧跟踪…

   [HttpException (0x80004005): DataBinding: 'System.Data.DataRowView' does not contain a                 property with the name 'DocumentID'.] 
       System.Web.UI.DataBinder.GetPropertyValue(Object container, String propName) +8672869
      System.Web.UI.WebControls.GridView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding) +2178
      System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable data) +57
      System.Web.UI.WebControls.GridView.PerformDataBinding(IEnumerable data) +14
      System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data) +114
      System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +31
      System.Web.UI.WebControls.DataBoundControl.PerformSelect() +142
      System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +73
      System.Web.UI.WebControls.GridView.DataBind() +4
      System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +82
      System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls() +72
      System.Web.UI.Control.EnsureChildControls() +87
      System.Web.UI.Control.PreRenderRecursiveInternal() +44
      System.Web.UI.Control.PreRenderRecursiveInternal() +171
      System.Web.UI.Control.PreRenderRecursiveInternal() +171

  System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +842

好吧,您還沒有選擇該documentid列,因此它不存在於您綁定到網格或通過數據表引用該列的數據表或數據視圖中。

將您的查詢更改為

SelectCommand="SELECT [DocumentID],[DocumentTitle], [DocumentBody] FROM [tblDocument]" /> 

1- 第一步,您必須在 SELECT 語句中選擇 Documentid 列

SelectCommand="SELECT [DocumentID], [DocumentTitle], [DocumentBody] FROM [tblDocument]" />

2-您必須像以前一樣將其包含在 datagridview COLUMN 中:

<asp:GridView ID="GridView1" runat="server" DataSourceID="sdsDocuments" EnableModelValidation="True"
       SelectedIndex="0" OnSelectedIndexChanged="GridView1_SelectedIndexChanged" DataKeyNames="DocumentID, DocumentTitle, DocumentBody">
       <Columns>
           <asp:BoundField DataField="DocumentID" HeaderText="DocumentID" ReadOnly="True" SortExpression="ID" />
           <asp:BoundField DataField="DocumentTitle" HeaderText="DocumentTitle" SortExpression="Title" />
           <asp:BoundField DataField="DocumentBody" HeaderText="DocumentBody" SortExpression="Body" />
           <asp:CommandField ShowSelectButton="True" ShowDeleteButton="True" />
       </Columns>
   </asp:GridView>

3-如果您在 datagridview AllowPaging=“True” 中使用分頁,您還必須在事件 OnSelectedIndexChanged=“GridView1_SelectedIndexChanged” 上選擇 documentid 以在第二頁和第三頁中選擇數據,依此類推:

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" DataSourceID="sdsDocuments" EnableModelValidation="True"
       SelectedIndex="0" OnSelectedIndexChanged="GridView1_SelectedIndexChanged" DataKeyNames="DocumentID, DocumentTitle, DocumentBody">

然後在事件 OnSelectedIndexChanged=“GridView1_SelectedIndexChanged” :

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
               DataTable dt = // your SELECT statement //
               GridView1.DataSource = dt;
               GridView1.PageIndex = e.NewPageIndex;
               GridView1.DataBind();
}

如果你不使用這個 void 那麼當你點擊第 2 頁時你會得到同樣的錯誤

引用自:https://stackoverflow.com/questions/6736052