100分再次紧急求助:detailsview中的dropdownlist,有一个无效 SelectedValue,因为它不在项目列表中

cppkiller 2010-10-27 08:41:32
前面我已经提了问题,帖子的链接在:

http://topic.csdn.net/u/20101025/02/afe9c853-df24-4998-858e-2bcf4ec3093c.html

,有几个朋友回复了,但我从回复中仍然不得要领。等了几天了,仍没有人再理那个帖子了,不得不再开贴说这事。
一个貌似简单的问题,让我被困扰了几个星期了。完全没有下手的地方。
一方面是因为我笨,另一方面我不得不骂微软的开发工程师,设计的那个detailsview和dropdownlist是些神马东西啊,一点都不好用。不仅这个detailsview,那个著名的gridview结合dropdownlist也一样,谁觉得好用?它的那个treeview也很难用,结合数据库,好用吗?

骂完了微软的开发工程师,还得回头来解决问题。


我再简化问题,有两个表,T1,T2。有一个页面,上有一个detailsview,其数据源是T1,其中字段F2在detailsview进入编辑和插入态时,变成下拉列表,该下拉列表的数据源是T2,显示的字段是FF2。可以从该下拉列表中选出值,在点保存更新按钮后,保存到数据库表T1中。
以上需求是非常常见的也应该是非常简单的。但是,我查了B&G,发现有很多关于这个问题的。看来,不仅是我遇到了这个问题,还有很多人也遇到了这个问题。
在中国的编程论坛上,无论如何将问题详细提出,得到的答案仍然是非常居高临下的,我也把这个问题提到老外的论坛上,得到了非常细致的回复,虽然目前还没有完全解决问题。

为方便试验,我将表的脚本列出:

USE [fortest]
GO
/****** Object: Table [dbo].[T1] Script Date: 10/27/2010 08:26:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[T1](
[F1] [int] NOT NULL,
[F2] [varchar](10) NOT NULL,
CONSTRAINT [PK_T1] PRIMARY KEY CLUSTERED
(
[F1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[T2] Script Date: 10/27/2010 08:26:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[T2](
[id] [int] NOT NULL,
[FF1] [int] NOT NULL,
[FF2] [varchar](10) NOT NULL,
CONSTRAINT [PK_T2] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: ForeignKey [FK_T2_T1] Script Date: 10/27/2010 08:26:36 ******/
ALTER TABLE [dbo].[T2] WITH CHECK ADD CONSTRAINT [FK_T2_T1] FOREIGN KEY([FF1])
REFERENCES [dbo].[T1] ([F1])
GO
ALTER TABLE [dbo].[T2] CHECK CONSTRAINT [FK_T2_T1]
GO

-----

...全文
129 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
happy664618843 2010-10-27
  • 打赏
  • 举报
回复
drop.selectedIndex=drop.Items.Indexof(drop.items.findByValue()); 用这个不会报错的 可以的 你试下!!!!!!!!
happy664618843 2010-10-27
  • 打赏
  • 举报
回复
drop.selectedIndex=drop.Items.Indexof(drop.items.findByValue());
happy664618843 2010-10-27
  • 打赏
  • 举报
回复
恩 这个问题我遇到过 这是因为你事先没有绑定
先绑定再选择项!!!
cppkiller 2010-10-27
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/en-us/library/ms178294(v=VS.90).aspx
这里是一个微软的资料,gridview和dropdownlist的。可参考。但是,这个资料看完了,觉得还是跟我的做法一样啊,为什么微软自己例子的就可以我的就报错?
Rock870210 2010-10-27
  • 打赏
  • 举报
回复
不要直接绑定DropDownList的数据源,可以在编辑的时候在后台获取编辑的那行,然后绑定DDL,这个应该是在执行SelectedValue的时候没有数据绑定到DDL上的原因
jieon 2010-10-27
  • 打赏
  • 举报
回复
没看明白。。顶。如果只是无效的话,跟踪看下是不空值了,绑定前先做判断
IHandler 2010-10-27
  • 打赏
  • 举报
回复
数据源没有null值,你在select语句中加where过滤一下或用ISNULL对空值转换一下试试
cppkiller 2010-10-27
  • 打赏
  • 举报
回复
以下是页面aspx文件内容:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>

<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False"
DataKeyNames="F1" DataSourceID="SqlDataSource1" Height="50px"
Width="125px" ondatabound="DetailsView1_DataBound">
<Fields>
<asp:BoundField DataField="F1" HeaderText="F1" ReadOnly="True"
SortExpression="F1" />
<asp:TemplateField HeaderText="F2" SortExpression="F2">
<EditItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server"
DataSourceID="SqlDataSource2" DataTextField="FF1" DataValueField="FF1"
SelectedValue='<%# Bind("F2") %>' >
</asp:DropDownList>

<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConflictDetection="CompareAllValues"
ConnectionString="<%$ ConnectionStrings:fortestConnectionString %>"
DeleteCommand="DELETE FROM [T1] WHERE [F1] = @original_F1 AND [F2] = @original_F2"
InsertCommand="INSERT INTO [T1] ([F1], [F2]) VALUES (@F1, @F2)"
OldValuesParameterFormatString="original_{0}"
SelectCommand="SELECT * FROM [T1]"
UpdateCommand="UPDATE [T1] SET [F2] = @F2 WHERE [F1] = @original_F1 AND [F2] = @original_F2">
<DeleteParameters>
<asp:Parameter Name="original_F1" Type="Int32" />
<asp:Parameter Name="original_F2" Type="String" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="F2" Type="String" />
<asp:Parameter Name="original_F1" Type="Int32" />
<asp:Parameter Name="original_F2" Type="String" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="F1" Type="Int32" />
<asp:Parameter Name="F2" Type="String" />
</InsertParameters>
</asp:SqlDataSource>
<asp:SqlDataSource ID="SqlDataSource2" runat="server"
ConnectionString="<%$ ConnectionStrings:fortestConnectionString %>"
DeleteCommand="DELETE FROM [T2] WHERE [id] = @id"
InsertCommand="INSERT INTO [T2] ([id], [FF1], [FF2]) VALUES (@id, @FF1, @FF2)"
SelectCommand="SELECT * FROM [T2]"
UpdateCommand="UPDATE [T2] SET [FF1] = @FF1, [FF2] = @FF2 WHERE [id] = @id">
<DeleteParameters>
<asp:Parameter Name="id" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="FF1" Type="Int32" />
<asp:Parameter Name="FF2" Type="String" />
<asp:Parameter Name="id" Type="Int32" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="id" Type="Int32" />
<asp:Parameter Name="FF1" Type="Int32" />
<asp:Parameter Name="FF2" Type="String" />
</InsertParameters>
</asp:SqlDataSource>
</EditItemTemplate>

<InsertItemTemplate>
<asp:DropDownList ID="DropDownList2" runat="server" AutoPostBack="True"
DataSourceID="Ss1" DataTextField="F2" DataValueField="F2">
</asp:DropDownList>
<asp:SqlDataSource ID="Ss1" runat="server" ConflictDetection="CompareAllValues"
ConnectionString="<%$ ConnectionStrings:fortestConnectionString %>"
DeleteCommand="DELETE FROM [T1] WHERE [F1] = @original_F1 AND [F2] = @original_F2"
InsertCommand="INSERT INTO [T1] ([F1], [F2]) VALUES (@F1, @F2)"
OldValuesParameterFormatString="original_{0}"
SelectCommand="SELECT * FROM [T1]"
UpdateCommand="UPDATE [T1] SET [F2] = @F2 WHERE [F1] = @original_F1 AND [F2] = @original_F2">
<DeleteParameters>
<asp:Parameter Name="original_F1" Type="Int32" />
<asp:Parameter Name="original_F2" Type="String" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="F2" Type="String" />
<asp:Parameter Name="original_F1" Type="Int32" />
<asp:Parameter Name="original_F2" Type="String" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="F1" Type="Int32" />
<asp:Parameter Name="F2" Type="String" />
</InsertParameters>
</asp:SqlDataSource>
<asp:SqlDataSource ID="SqlDataSource3" runat="server"
ConflictDetection="CompareAllValues"
ConnectionString="<%$ ConnectionStrings:fortestConnectionString %>"
DeleteCommand="DELETE FROM [T2] WHERE [id] = @original_id AND [FF1] = @original_FF1 AND [FF2] = @original_FF2"
InsertCommand="INSERT INTO [T2] ([id], [FF1], [FF2]) VALUES (@id, @FF1, @FF2)"
OldValuesParameterFormatString="original_{0}"
SelectCommand="SELECT * FROM [T2]"
UpdateCommand="UPDATE [T2] SET [FF1] = @FF1, [FF2] = @FF2 WHERE [id] = @original_id AND [FF1] = @original_FF1 AND [FF2] = @original_FF2">
<DeleteParameters>
<asp:Parameter Name="original_id" Type="Int32" />
<asp:Parameter Name="original_FF1" Type="Int32" />
<asp:Parameter Name="original_FF2" Type="String" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="FF1" Type="Int32" />
<asp:Parameter Name="FF2" Type="String" />
<asp:Parameter Name="original_id" Type="Int32" />
<asp:Parameter Name="original_FF1" Type="Int32" />
<asp:Parameter Name="original_FF2" Type="String" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="id" Type="Int32" />
<asp:Parameter Name="FF1" Type="Int32" />
<asp:Parameter Name="FF2" Type="String" />
</InsertParameters>
</asp:SqlDataSource>
</InsertItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Eval("F2") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField ButtonType="Button" ShowEditButton="True"
ShowInsertButton="True" />
</Fields>
</asp:DetailsView>

</div>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConflictDetection="CompareAllValues"
ConnectionString="<%$ ConnectionStrings:fortestConnectionString %>"
DeleteCommand="DELETE FROM [T1] WHERE [F1] = @original_F1 AND [F2] = @original_F2"
InsertCommand="INSERT INTO [T1] ([F1], [F2]) VALUES (@F1, @F2)"
OldValuesParameterFormatString="original_{0}"
SelectCommand="SELECT * FROM [T1]"
UpdateCommand="UPDATE [T1] SET [F2] = @F2 WHERE [F1] = @original_F1 AND [F2] = @original_F2">
<DeleteParameters>
<asp:Parameter Name="original_F1" Type="Int32" />
<asp:Parameter Name="original_F2" Type="String" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="F2" Type="String" />
<asp:Parameter Name="original_F1" Type="Int32" />
<asp:Parameter Name="original_F2" Type="String" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="F1" Type="Int32" />
<asp:Parameter Name="F2" Type="String" />
</InsertParameters>
</asp:SqlDataSource>
</form>
</body>
</html>
----------
没有写cs文件。

最后,再次强烈鄙视微软的VS开发工程师做的VisualStudio里面的GridView和DetailsView以及DropDownList!

----帖子内容太长,只能分两段发。
cppkiller 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cppkiller 的回复:]
http://msdn.microsoft.com/en-us/library/ms178294(v=VS.90).aspx
这里是一个微软的资料,gridview和dropdownlist的。可参考。但是,这个资料看完了,觉得还是跟我的做法一样啊,为什么微软自己例子的就可以我的就报错?
[/Quote]
仔细看了,微软这例子里,dropdownlist的数据源和detailsview的数据源为同一个表:employees。这样,就不会出现“。。dropdownlist 有一个无效 SelectedValue,因为它不在项目列表中”这样的诡异的问题了。
而我需要从另一个表里取值填充dropdownlist。
cppkiller 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 happy664618843 的回复:]
drop.selectedIndex=drop.Items.Indexof(drop.items.findByValue()); 用这个不会报错的 可以的 你试下!!!!!!!!
[/Quote]谢谢啊!可你这段代码写到哪里呢?

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧