为什么我不能访问这个 RadGrid 控件
Why can I not access this RadGrid Control
我有一个非常简单的 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;
}
}
当我 运行 代码时,我收到此错误消息:{"Object reference not set to an instance of an object."}
看来我没有获得对控件的引用。谁能告诉我这里发生了什么?我已经使用这种方法从使用 USerControl 的 RadGrid 中获取值来编辑或添加记录,这是我第一次尝试使用就地编辑。
我能够访问控件,但不得不删除 The Telerik GridBoundColumn,而是使用 GridTemplateColumn、ItemTemplat 和 EidtItemTemplate。在 EditdItemTemplate 中,我使用 asp 文本框。
我仍然有一个问题,当我单击编辑按钮时,会出现弹出表单,但填充了 none 的数据。下面是我的 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();
根据我使用就地编辑的经验,您不需要任何 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;
}
}
}
我的问题解决了请看原文post。我添加了解释以及我用来解决问题的 asp 和 C# 代码。
我有一个非常简单的 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;
}
}
当我 运行 代码时,我收到此错误消息:{"Object reference not set to an instance of an object."}
看来我没有获得对控件的引用。谁能告诉我这里发生了什么?我已经使用这种方法从使用 USerControl 的 RadGrid 中获取值来编辑或添加记录,这是我第一次尝试使用就地编辑。
我能够访问控件,但不得不删除 The Telerik GridBoundColumn,而是使用 GridTemplateColumn、ItemTemplat 和 EidtItemTemplate。在 EditdItemTemplate 中,我使用 asp 文本框。
我仍然有一个问题,当我单击编辑按钮时,会出现弹出表单,但填充了 none 的数据。下面是我的 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();
根据我使用就地编辑的经验,您不需要任何 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;
}
}
}
我的问题解决了请看原文post。我添加了解释以及我用来解决问题的 asp 和 C# 代码。