我似乎无法获取我的详细信息视图以进入编辑模式。我以编程方式绑定数据源。当item命令为“edit”时,我将模式更改为“edit”并重新绑定数据源。我在控制数据绑定后检查了它仍处于编辑模式,但详细信息视图未在编辑模式下显示。任何帮助将不胜感激。目前,我的详细信息视图已简化为一个用于测试的元素(这是来自ASP.NET论坛的交叉帖子,因为我可以相对较快地使用一些帮助)
ASPX:
<div style="width:990px;height:430px;">
<div style="width:650px;height:430px;float:left;">
<telerik:RadAjaxLoadingPanel ID="devicesLoadingPanel" runat="server" Skin="Simple" />
<telerik:RadGrid ID="devicesRadGrid" runat="server" Skin="Simple" AllowPaging="true" Width="550" PageSize="15"
AutoGenerateColumns="false" DataSourceID="SqlDataSource1" OnSelectedIndexChanged="devicesGrid_SelectedIndexChanged">
<MasterTableView DataKeyNames="ID" CommandItemDisplay="Top">
<Columns>
<telerik:GridTemplateColumn HeaderText="Type" SortExpression="Type">
<ItemTemplate>
<asp:Label ID="lblType" runat="server" Text='<%# evalLabelType((Eval("UnitType"))) %>' />
</ItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridBoundColumn HeaderText="Name" DataField="Name" SortExpression="Name"></telerik:GridBoundColumn>
<telerik:GridBoundColumn HeaderText="Description" DataField="Description" SortExpression="Description"></telerik:GridBoundColumn>
<telerik:GridTemplateColumn HeaderText="Location">
<ItemTemplate>
<asp:Label ID="lblDevicesLocation" runat="server" Text='<%# evalDevicesLocation(Eval("LocationID")) %>' />
</ItemTemplate>
</telerik:GridTemplateColumn>
</Columns>
<CommandItemSettings ShowAddNewRecordButton="true" ShowRefreshButton="false" />
</MasterTableView>
<ClientSettings EnablePostBackOnRowClick="true">
<Selecting AllowRowSelect="true" />
</ClientSettings>
</telerik:RadGrid>
</div>
<div style="border: 1px solid #000;width:250px;height:430px;float:left;" >
<asp:DetailsView ID="devicesDetailsView" runat="server" AutoGenerateRows="false" Width="200" Height="430"
CellPadding="0" GridLines="None"
OnItemCommand="devicesDetails_ItemCommand" OnDataBound="devicesDetails_DataBound">
<Fields>
<asp:TemplateField>
<ItemTemplate>
<span class="titles">Type:</span>
<asp:Label ID="lblType" runat="server" Text='<%# evalLabelType((Eval("UnitType"))) %>' />
</ItemTemplate>
<EditItemTemplate>
<span class="titles">Type:</span>
<asp:TextBox ID="txtType" runat="server" Text="test" />
</EditItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowEditButton="true" ButtonType="Button" />
</Fields>
</asp:DetailsView>
</div>
C#:
protected void devicesGrid_SelectedIndexChanged(object sender, EventArgs e)
{
devicesDataKey = devicesRadGrid.SelectedItems[0].OwnerTableView.DataKeyValues[devicesRadGrid.SelectedItems[0].ItemIndex]["ID"].ToString();
devicesDetailsView.DataSource = getDS();
devicesDetailsView.DataBind();
}
protected void devicesDetails_ItemCommand(object sender, DetailsViewCommandEventArgs e)
{
if (e.CommandName == "Edit")
{
// Switch mode and rebind
devicesDetailsView.ChangeMode(DetailsViewMode.Edit);
devicesDetailsView.DataSource = getDS();
devicesDetailsView.DataBind();
}
}
protected void devicesDetails_DataBound(object sender, EventArgs e)
{
//HideShowFields(devicesDataKey);
// Checking the mode again
string test22 = devicesDetailsView.CurrentMode.ToString();
}
protected DataTable getDS()
{
string ID = devicesDataKey;
// Get that device type!
SqlCommand getDeviceType = new SqlCommand("SELECT UnitType FROM dbo.unit WHERE ID='" + ID + "'", connection);
connection.Open();
devicesTypeID = getDeviceType.ExecuteScalar().ToString();
connection.Close();
getDeviceType.Dispose();
// This for attenuation. Depending on the device type it may pull from a different table.
if (devicesTypeID == "2" || devicesTypeID == "3" || devicesTypeID == "4")
{
SqlCommand cmd = new SqlCommand("SELECT UnitType,Unit.Active,Name, Description, PrinterName, PrinterPort, PrinterIP, Unit.IPAddress, Unit.ID, LockHoldTimeout,LightOnTimeout, DoorAlertTimeout, EnableEmergAccess, EnableBizHours, ReaderAttenuation, Attenuation, Unit.LocationID, ScanTime FROM dbo.Unit INNER JOIN dbo.Readers on Unit.ID = Readers.UnitID WHERE Unit.ID='" + ID + "'", connection);
DataTable dt = new DataTable();
connection.Open();
using (cmd)
{
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
}
connection.Close();
// Attach the data to the details view
return dt;
}
if (devicesTypeID == "5" || devicesTypeID == "6")
{
SqlCommand cmd = new SqlCommand("SELECT UnitType,Unit.Active,Name, Description, PrinterName, PrinterPort, PrinterIP, Unit.IPAddress, Unit.ID, LockHoldTimeout,LightOnTimeout, DoorAlertTimeout, EnableEmergAccess, EnableBizHours, ReaderAttenuation, Unit.LocationID, ScanTime, Attenuation FROM dbo.Unit, dbo.Readers WHERE Unit.ID='" + ID + "'", connection);
DataTable dt = new DataTable();
connection.Open();
using (cmd)
{
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
}
connection.Close();
// Attach the data to the details view
return dt;
}
return null;
}
答案 0 :(得分:1)
我弄清楚了,事实证明我的Telerik Ajax Manager隐藏了我得到的错误。我收到了“DetailsView触发事件ModeChanging”,我使用以下链接中的说明解决了这个问题:forums.asp.net
答案 1 :(得分:0)
来自@Will提到的asp.net论坛链接的简单摘要:
protected void dvSupplier_ModeChanging(object sender, DetailsViewModeEventArgs e)
{
dvSupplier.ChangeMode(e.NewMode);
this.SetData();
}