【问题标题】:Why can I not access this RadGrid Control为什么我无法访问此 RadGrid 控件
【发布时间】:2018-04-19 14:44:39
【问题描述】:

我有一个非常简单的 Telerik RadGrid,我没有使用自动生成列。我正在使用网格列并创建自己的列。我将编辑模式设置为就地。这是 RAdGid 的 ASPX

<div id="Grid">
                <telerik:RadGrid RenderMode="Lightweight" runat="server" ID="RadGrid1" AutoGenerateColumns="false" AllowPaging="true"
                    OnNeedDataSource="UserGrid_NeedDataSource" OnUpdateCommand="RadGrid1_UpdateCommand"
                    OnItemCreated="RadGrid1_ItemCreated" OnDeleteCommand="RadGrid1_DeleteCommand"
                    OnInsertCommand="RadGrid1_InsertCommand">
                    <MasterTableView DataKeyNames="UserID" CommandItemDisplay="Top" EditMode="InPlace">
                        <Columns>
                            <telerik:GridEditCommandColumn />
                            <telerik:GridBoundColumn DataField="UserID" HeaderText="User ID" ReadOnly="true"
                                ForceExtractValue="Always" ConvertEmptyStringToNull="true" />
                            <telerik:GridCheckBoxColumn DataField="Active" HeaderText="Active" SortExpression="Active" UniqueName="chkActive"></telerik:GridCheckBoxColumn>
                            <telerik:GridTemplateColumn HeaderText="Role">
                                <ItemTemplate>
                                    <%#DataBinder.Eval(Container.DataItem, "Role")%>
                                </ItemTemplate>
                                <EditItemTemplate>
                              <asp:DropDownList runat="server" ID="ddlRoles">
                                  <asp:ListItem Text ="Admin" Value ="Administrator"></asp:ListItem>
                                  <asp:ListItem Text ="User" Value ="User"></asp:ListItem>
                              </asp:DropDownList>
                          </EditItemTemplate>
                            </telerik:GridTemplateColumn>
                            <telerik:GridBoundColumn DataField="FirstName" HeaderText="First Name" UniqueName="FirstName" />
                            <telerik:GridButtonColumn ConfirmText="Delete this User?" ConfirmDialogType="RadWindow"
                                ConfirmTitle="Delete" ButtonType="FontIconButton" CommandName="Delete" />
                        </Columns>
                        <EditFormSettings InsertCaption="Add new item" CaptionFormatString="Edit User: {0}" CaptionDataField="FirstName">
                             <EditColumn FilterControlAltText="Filter EditCommandColumn column"></EditColumn>
                        </EditFormSettings>
                    </MasterTableView>
                    <PagerStyle Mode="NextPrevAndNumeric" />
                </telerik:RadGrid>
            </div>

我删除了几列以缩短代码示例。下面是一个缩短的 e C# 代码

protected void RadGrid1_UpdateCommand(object sender, GridCommandEventArgs e)
    {
        GridEditableItem editedItem = e.Item as GridEditableItem;
        UserControl userControl = (UserControl)e.Item.FindControl(GridEditFormItem.EditFormUserControlID);
        string strUserID = editedItem.OwnerTableView.DataKeyValues[editedItem.ItemIndex]["UserID"].ToString();
        int intUserId = Convert.ToUInt16(strUserID);

        using (ExpungeEntities db = new ExpungeEntities())
        {

            var Results = db.USERS_T_DATA.SingleOrDefault(i => i.UserID == intUserId);
            if (Results == null)
            {
                RadGrid1.Controls.Add(new LiteralControl("Unable to locate that user for updating"));
                e.Canceled = true;
                return;
            }
            Results.Role = (userControl.FindControl("ddlRoles") as DropDownList).SelectedValue;
            Results.FirstName = (userControl.FindControl("FirstName") as TextBox).Text;

        }
    }

当我运行代码时,我收到以下错误消息:{“对象引用未设置为对象的实例。”}

看起来我没有得到对控件的引用。谁能告诉我这里发生了什么?我已经使用这种方法从 RadGrid 中获取值,使用 USerControl 来编辑或添加记录,这是我第一次尝试使用 Inplace 编辑。

我能够访问这些控件,但必须消除 Telerik GridBoundColumn,而是使用 GridTemplateColumn、ItemTemplat 和 EidtItemTemplate。在 EditdItemTemplate 中,我使用了一个 asp 文本框。

我仍然有一个问题,当我单击编辑按钮时,会出现弹出表单,但没有填充任何数据。下面是我的 RadGrid 行的示例。

                                    <ItemTemplate>
                                    <asp:Label ID="lblFirstName" runat="server"
                                        Text='<%# DataBinder.Eval(Container.DataItem, "FirstName") %>'>
                                    </asp:Label>
                                </ItemTemplate>
                                <EditItemTemplate>
                                    <asp:TextBox ID="txtFirstName" runat="server"></asp:TextBox>
                                </EditItemTemplate>
                            </telerik:GridTemplateColumn>

我使用这个 C# 代码访问控件:

DropDownList ddl = (DropDownList)editableItem.FindControl("ddlRole") as 
DropDownList;
            d.Role = ddl.SelectedValue;
            CheckBox CheckBox1 = editableItem.FindControl("chkActive") as 
CheckBox;
            d.Active = CheckBox1.Checked;
            d.FirstName = (editableItem.FindControl("txtFirstName") as 
TextBox).Text.Trim();

【问题讨论】:

  • 你在哪一行得到这个错误?
  • Results.Role = (userControl.FindControl("ddlRoles") as DropDownList).SelectedValue;行

标签: c# gridview telerik telerik-grid


【解决方案1】:

根据我使用 InPlace 编辑的经验,您不需要任何 UserControl 即可访问您的编辑控件。您可以直接从 GridEditableItem 访问它们。尝试像这样访问您的控件:

var ddlRoles = editedItem.FindControl("ddlRoles") as DropDownList;
if(ddlRoles != null)
{
    // use your drop down list
}

我倾向于使用内联临时变量进行安全转换。以下是我将如何重写您的代码(如果您使用 C# 7)。

protected void RadGrid1_UpdateCommand(object sender, GridCommandEventArgs e)
{
    if (e.Item is GridEditableItem editedItem)
    {
        var strUserID = Convert.ToString(editedItem.OwnerTableView.DataKeyValues[editedItem.ItemIndex]["UserID"]);
        var intUserId = Convert.ToUInt16(strUserID);

        using (ExpungeEntities db = new ExpungeEntities())
        {
            var Results = db.USERS_T_DATA.SingleOrDefault(i => i.UserID == intUserId);
            if (Results == null)
            {
                RadGrid1.Controls.Add(new LiteralControl("Unable to locate that user for updating"));
                e.Canceled = true;
                return;
            }

            if (editedItem.FindControl("ddlRoles") is DropDownList ddlRoles)
                Results.Role = ddlRoles.SelectedValue;

            if (editedItem.FindControl("FirstName") is TextBox txtFirstName)
                Results.FirstName = txtFirstName.Text;    
        }
    }
}

【讨论】:

    【解决方案2】:

    我能够解决我的问题,请查看原帖。我添加了解释以及我用来解决问题的 asp 和 C# 代码。

    【讨论】:

      猜你喜欢
      • 2012-05-20
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 2015-01-11
      • 2014-04-06
      相关资源
      最近更新 更多