【问题标题】:Error when passing values from dataview to datatable rowcell将值从数据视图传递到数据表行单元时出错
【发布时间】:2017-11-29 05:47:52
【问题描述】:

我有一个页面有两个gridview;一个在模式弹出窗口内(grdEmpName),另一个在页面中(gvUser)。现在,当用户选择搜索按钮时,模态弹出扩展器将弹出,然后搜索员工。当用户选择某人时,所选数据应显示到另一个 gridview (gvUser) 的文本框中。

一切都在模态弹出扩展器网格视图(grdEmpName)中进行选择,但是当我选择没有数据传递到另一个网格视图时。 (gv用户)。我需要在文本框中显示选定的数据。

ASPX:

<asp:GridView ID="gvUser" runat="server" Width="1024px"
                PageSize="10"  
                AutoGenerateColumns = "False"  
                AllowSorting="true"  
                AllowPaging="true"  
                ShowFooter="True" 
                OnSorting="gvUser_Sorting"  
                OnPageIndexChanging="gvUser_PageIndexChanging"  
                OnRowCreated="gvUser_RowCreated"
                CssClass="Grid"  
                AlternatingRowStyle-CssClass="alt" 
                PagerStyle-CssClass="pgr"  
                FooterStyle-HorizontalAlign="center" > 
                <PagerSettings Mode="NumericFirstLast" PageButtonCount="5" FirstPageImageUrl="~/images/gridview/first_16x16.png" LastPageImageUrl="~/images/gridview/last_16x16.png"  />
                <Columns>
                    <asp:TemplateField> 
                        <ItemTemplate >      
                            <asp:ImageButton ID="ibtnEdit" runat="server"  ImageUrl="~/images/gridview/file_edit_24x24.png"  title = "Edit"  _CommandArgument='<%# Eval("USR_ID") & "|Edit|" &  CType(Container,GridViewRow).RowIndex & "|-" %>'  />
                            <asp:ImageButton ID="ibtnUpdate" runat="server" ImageUrl="~/images/gridview/file_save_24x24.png" visible="false" title="Update" _CommandArgument='<%# Eval("USR_ID") & "|Update|" &  CType(Container,GridViewRow).RowIndex  & "|-" %>' />  
                            <asp:ImageButton ID="ibtnCancel" runat="server" ImageUrl="~/images/gridview/file_cancel_24x24.png" Visible="false" title="Cancel" _CommandArgument='<%# Eval("USR_ID")& "|Cancel|" &  CType(Container,GridViewRow).RowIndex & "|-" %>'  /> 
                            <asp:ImageButton ID="ibtnDelete" runat="server" ImageUrl="~/images/gridview/file_delete_24x24.png" title="Delete"  _CommandArgument='<%# Eval("USR_ID")& "|Delete|" &  CType(Container,GridViewRow).RowIndex & "|" & Eval("USR_IDNTY") %>'   /> 
                            <asp:ImageButton ID="btnSearchUser" runat="server" ImageUrl="~/images/gridview/file_search_24x24.png" title="Search" _CommandArgument= "btnSearchUser" OnClick = "btnSearchUser_Click"  /> 
                        </ItemTemplate> 

                        <FooterTemplate>
                            <asp:ImageButton ID="ibtnAdd" runat="server" ImageUrl="~/images/gridview/file_add_24x24.png" title="Add" _CommandArgument='<%# Eval("USR_ID") & "|Add|" &  CType(Container,GridViewRow).RowIndex & "|-" %>' /> 

                        </FooterTemplate>

                        <HeaderStyle Wrap="False" />
                        <ItemStyle Wrap="False" Width="50px"  />            
                    </asp:TemplateField>
                <asp:TemplateField HeaderText="User Identity" visible ="false" >

                        <ItemTemplate>
                            <asp:Label ID="lblUSR_IDNTY" runat="server" Text='<%# Bind("USR_IDNTY")%>' />
                        </ItemTemplate>

                        <EditItemTemplate>
                            <asp:Label ID="lblUSR_IDNTY" runat="server" Width="95%"  Text='<%# Bind("USR_IDNTY")%>' />
                        </EditItemTemplate>  

                        <HeaderStyle Wrap="False" />
                        <ItemStyle Wrap="False" />
                 </asp:TemplateField>                        

                    <asp:TemplateField HeaderText="User ID" SortExpression="USR_ID">
                        <ItemTemplate>
                            <asp:Label ID="lblUSR_ID" runat="server" Text='<%# Bind("USR_ID")%>' />
                        </ItemTemplate>

                        <EditItemTemplate>
                            <asp:Label ID="txtUSR_ID" runat="server" Width="95%"  Text='<%# Bind("USR_ID")%>' />
                        </EditItemTemplate>  

                         <FooterTemplate>
                            <asp:TextBox ID="txtUSR_ID" runat="server" Width="95%"/>
                        </FooterTemplate>                    

                        <HeaderStyle Wrap="False" />
                        <ItemStyle Wrap="False" />
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Name"  SortExpression="NAME">
                        <ItemTemplate>
                            <asp:Label ID="lblNAME" runat="server" Text='<%# Bind("NAME")%>' />
                        </ItemTemplate>

                        <EditItemTemplate>
                            <asp:TextBox ID="txtNAME" runat="server" Width="95%" Text='<%# Bind("NAME")%>'/>
                        </EditItemTemplate>        

                        <FooterTemplate>
                            <asp:TextBox ID="txtNAME" runat="server" Width="95%"/>
                        </FooterTemplate>

                        <HeaderStyle Wrap="False" />
                        <ItemStyle Wrap="False" />
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Email"  SortExpression="EMAIL">
                        <ItemTemplate>
                            <asp:Label ID="lblEMAIL" runat="server" Text='<%# Bind("EMAIL")%>' />
                        </ItemTemplate>

                        <EditItemTemplate>
                            <asp:TextBox ID="txtEMAIL" runat="server" Width="95%"  Text='<%# Bind("EMAIL")%>'/>
                        </EditItemTemplate>        

                        <FooterTemplate>
                            <asp:TextBox ID="txtEMAIL" runat="server" Width="95%"/>
                        </FooterTemplate>

                        <HeaderStyle Wrap="False" />
                        <ItemStyle Wrap="False" />
                    </asp:TemplateField> 
                    <asp:TemplateField HeaderText="Active"  SortExpression="ACTIVE">
                        <ItemTemplate>
                             <asp:CheckBox ID="chkACTIVE"  runat="server" Checked ='<%# Bind("ACTIVE")%>' Enabled="false"   />
                        </ItemTemplate>

                        <EditItemTemplate>
                            <asp:CheckBox  ID="chkACTIVE" runat="server" Width="95%" Checked ='<%# Bind("ACTIVE")%>'/> 
                        </EditItemTemplate>        

                        <FooterTemplate>
                            <asp:CheckBox  ID="chkACTIVE" runat="server" Width="95%"/>
                        </FooterTemplate>

                        <HeaderStyle Wrap="False" />
                        <ItemStyle HorizontalAlign="Center"  Wrap="False"/> 
                    </asp:TemplateField>                                                                                                  
                </Columns>
               <EmptyDataTemplate>
                    <div style="height:315px;border-style:hidden;" >
                        <table class="table" >
                            <tr>
                                <td style="padding:5px;" >
                                    <img id="Img1" style="height:24px;width:24px; "  runat="server" src="images/no_data_64x64.png" />    
                                </td>
                                <td style="padding:5px;font-size:large;">
                                     <b>No data found.</b>
                                </td> 
                            </tr>
                        </table>
                    </div>  
                </EmptyDataTemplate>

                <PagerStyle CssClass="pgr" />
                <AlternatingRowStyle CssClass="alt"  />
                <FooterStyle HorizontalAlign="Center" />
                <EmptyDataRowStyle CssClass="EmptyData" />
              </asp:GridView>
          </div>                                        

       <%-- Picker--%>

       <cc1:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
        </cc1:ToolkitScriptManager>


       <cc1:ModalPopupExtender   runat="server" TargetControlID="hdControl" ID="mdlEmpListProcess"  PopupControlID="empPanel" CancelControlID="btnClose"  OnCancelScript="getFlickerSolved();" >
       </cc1:ModalPopupExtender>

      <asp:HiddenField runat="server" ID="hdControl" />
      <asp:Panel runat="server" ID="empPanel"  Width="909px" Height="300"  BorderStyle="Ridge" BorderColor="Gray" Style="display:none;" BackColor="Control">

       <table>
                     <tr>
                        <td>
                            &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;
                            <asp:TextBox runat="server" id="txtEmpName" CssClass="textbox" Width="240"></asp:TextBox>
                            &nbsp;<asp:Button runat="server" ID="btnSearchEmp" CssClass="button" Text="SEARCH" OnClientClick="getFlickerSolved();"/>
                                   <asp:Button runat="server" ID="btnClose" CssClass="button" Text="CLOSE" />
                        </td>
                     </tr>
       </table>   &nbsp;<br />
           &nbsp; &nbsp;
        <div style="overflow:scroll; width:882px; height:233px;"> 
                           <asp:GridView runat="server" ID="grdEmpName"   Width="863px" AutoGenerateColumns="False" BackColor="White" BorderColor="#999999" BorderStyle="Solid" BorderWidth="1px" CellPadding="3" ForeColor="Black" Height="35px" GridLines="Vertical">
                                <Columns>
                                        <asp:TemplateField>
                                                <ItemTemplate>
                                                        <asp:RadioButton runat="server" ID="optEmp" AutoPostBack="true" _CommandArgument= "Select" OnCheckedChanged="selectedEmployee" />
                                                </ItemTemplate>
                                        </asp:TemplateField>
                                        <asp:BoundField DataField="USR_ID" HeaderText="USER ID"/>
                                        <asp:BoundField DataField="NAME"  HeaderText="NAME"/>
                                        <asp:BoundField DataField="EMAIL" HeaderText="EMAIL ADDRESS">  
                                            <HeaderStyle Width="300px" />
                                        </asp:BoundField>        
                                </Columns>
                               <RowStyle CssClass="rowStyle" />
                               <HeaderStyle CssClass="headerStyle" BackColor="Black" Font-Bold="True" ForeColor="White" />
                               <FooterStyle BackColor="#CCCCCC" />
                               <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
                               <SelectedRowStyle BackColor="#000099" Font-Bold="True" ForeColor="White" />
                               <AlternatingRowStyle BackColor="#CCCCCC" />
                          </asp:GridView>        
         </div>
          </asp:Panel>

         <%-- End Picker--%>

现在,这里是 selectedEmployee(单选按钮)的代码

Protected Sub selectedEmployee(ByVal sender As Object, ByVal e As System.EventArgs)


    Dim lnBTNDone As RadioButton = DirectCast(sender, RadioButton)
    Dim row As GridViewRow = DirectCast(lnBTNDone.NamingContainer, GridViewRow)

    Dim RowIndex As Integer = gvUser.EditIndex
    Dim dt As New DataTable
    dt = TryCast(Session("dbCache_User"), DataView).Table.Copy


    Dim dv As New DataView(dt, "", "USR_IDNTY", DataViewRowState.OriginalRows)
    Dim s As String = TryCast(gvUser.Rows(RowIndex).FindControl("lblUSR_IDNTY"), Label).Text
    Dim idx As Integer = dv.Find(s)

    dv(idx)("USR_ID") = row.Cells(1).Text
    dv(idx)("NAME") = row.Cells(2).Text
    dv(idx)("EMAIL") = row.Cells(3).Text


    gvUser.DataSource = dv
    gvUser.DataBind()

    Me.mdlEmpListProcess.Hide()

End Sub

但我在调试 system.data.dataexception 未被用户代码处理时遇到了这个错误。传递值时无法设置名称

dv(idx)("NAME") = row.Cells(2).Text

【问题讨论】:

    标签: asp.net vb.net gridview


    【解决方案1】:

    根据您的评论,NAME is readonly field error given at runtime than you make is readonly false 如下,读取值后在代码中添加相同的行

     dt.Columns["NAME"].ReadOnly = false
    

    工作示例

            DataTable dataTable = new DataTable("dataTable");
            DataColumn dataColumn = new DataColumn("dataColumn");
            dataTable.Columns.Add(dataColumn);
    
            // Add ten rows.
            DataRow dataRow;
            for (int i = 0; i < 10; i++)
            {
                dataRow = dataTable.NewRow();
                dataRow["dataColumn"] = "item " + i;
                dataTable.Rows.Add(dataRow);
            }
            dataTable.AcceptChanges();///add this line in your code 
    
            var dv = new DataView(dataTable, "", "dataColumn", DataViewRowState.OriginalRows);
            int index = dv.Find("item 1");
            if (index == -1)
                Console.WriteLine("Product not found");
            else
                dv[index]["dataColumn"] = "item 1000";
    

    我建议先检查你是否能找到行

              int idx = dv.Find(s);
              if (index == -1)
                {
                    Console.WriteLine ("Product not found");
                }
                else
                {
                    dv[index]["columnname"] = "value";
                }
    

    【讨论】:

    • 嗨。我已经检查过了,我能够找到行并且仍然在 dv(idx)("NAME") = row.Cells(2).Text 中得到错误
    • 是的,在传递 USR_ID 上的值然后传递给 NAME 之后调试时,我得到了错误。我已经检查表中的“NAME”字段不是只读的,所以我在想我做错了什么。
    • @Yinah - 检查我的更新并添加 dataTable.AcceptChanges();在您的代码中
    • @Yinah - 也添加这一行 dt.Columns["NAME"].ReadOnly = false;在你写 acceptchange() 函数之前
    • 我已经更新了我的代码并添加了您的建议,但在“NAME”上仍然出现同样的错误。
    猜你喜欢
    • 2013-07-29
    • 2020-01-10
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多