none
如何让DataGridView中的ComboBoxColumn列既能显示已有记录,又能提供选择列表? RRS feed

  • 问题

  • 数据库中有两个表:

    表一[tbUser],字段:userID(工号)、userName(姓名)、uID(单位号)、uNa(单位名称)

    表二[tbUnit],字段:uID(单位号)、uNa(单位名称)

    两个表关系:tbUser.uID=tbUnit.uID(通过单位ID号连接)

    操作:在窗体frmUser中加入DataGridView控件dgvUser,表格控件通过数据表绑定到表一[tbUser]中的三个列:

    userID(工号)、userName(姓名)、uNa(单位名称)

    目的:在这个窗体frmUser中可以显示出所有的员工信息,并且可以修改员工信息并同步到数据库中。现在:数据绑定、显示表一[tbUser]数据、修改、更新数据库的功能已实现。

    问题:希望将第三列uNa(单位名称)变为下拉列表框的形式(ComboBoxColumn),可以从中选择表二[tbUnit]中的所有”单位名称“以修改这个字段的值,不可输入其它值;并且窗体打开时显示的值与存在的员工记录匹配。这一步不知道怎么做,希望高手给个思路,帮我解决这个让我脑残的问题,谢谢!


    LJH

    2012年12月9日 8:17

答案

  •  <asp:TemplateField HeaderText="权限">
                                            <ItemTemplate>
                                            <%#GetPowerName(Convert.ToInt32(Eval("Power")))%>
                                            </ItemTemplate>
                                            <EditItemTemplate>
                                                <asp:DropDownList ID="DropPower" runat="server" AutoPostBack="True" 
                                                    onselectedindexchanged="DropPower_SelectedIndexChanged">
                                                    <asp:ListItem Value="3">普通管理员</asp:ListItem>
                                                    <asp:ListItem Value="2">课程管理员</asp:ListItem>
                                                    <asp:ListItem Value="1">超级管理员</asp:ListItem>
                                                </asp:DropDownList>
                                                <asp:Literal ID="ltrPower" Visible="false" Text='<%#Eval("Power")%>' runat="server"></asp:Literal>
                                                <asp:Literal ID="ltrID" Visible="false" Text='<%#Eval("ID")%>' runat="server"></asp:Literal>
                                            </EditItemTemplate>
                                        </asp:TemplateField>

    这是 我以前写的ASP.NET 代码,ComboBox和DropDownList是相同的,你也可以给它绑定数据源

    后台代码:

      protected void DropPower_SelectedIndexChanged(object sender, EventArgs e)
        {
            ((Literal)((DropDownList)sender).Parent.FindControl("ltrPower")).Text = ((DropDownList)sender).SelectedValue;
        }

    • 已编辑 January0932 2012年12月10日 8:47
    • 已标记为答案 SZLJH 2012年12月10日 10:17
    2012年12月10日 8:45

全部回复

  • dear

    你可使用 Enum 栏位来绑定,或是使用List<string>,换言之,你可在另外定义一个sql name table 里面摆放单位名称,当事件触发时,将该表呈现出来。

    以下是透过 DTO 处理 data binding

    http://www.dotblogs.com.tw/yc421206/archive/2011/08/16/33255.aspx

    http://www.dotblogs.com.tw/yc421206/archive/2011/08/04/32556.aspx

    http://www.dotblogs.com.tw/yc421206/archive/2011/03/07/21706.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年12月9日 17:44
  • 谢谢余小章老师给出的思路,按照你提供的链接,进入了一上叫做“点部落”的网站,可是看不到需要的任何内容。总之还是要谢谢你的热心帮助!


    LJH

    2012年12月10日 1:26
  • dear

    请问,看不到需要的内容是啥意思??

    是浏览不到任何资料??

    还是要按照您的资料表建立才是您需要的吗??


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年12月10日 3:52
  • 我是说:进入你指定的网址后,在里面点击链接没有任何反应

    LJH

    2012年12月10日 8:12
  •  <asp:TemplateField HeaderText="权限">
                                            <ItemTemplate>
                                            <%#GetPowerName(Convert.ToInt32(Eval("Power")))%>
                                            </ItemTemplate>
                                            <EditItemTemplate>
                                                <asp:DropDownList ID="DropPower" runat="server" AutoPostBack="True" 
                                                    onselectedindexchanged="DropPower_SelectedIndexChanged">
                                                    <asp:ListItem Value="3">普通管理员</asp:ListItem>
                                                    <asp:ListItem Value="2">课程管理员</asp:ListItem>
                                                    <asp:ListItem Value="1">超级管理员</asp:ListItem>
                                                </asp:DropDownList>
                                                <asp:Literal ID="ltrPower" Visible="false" Text='<%#Eval("Power")%>' runat="server"></asp:Literal>
                                                <asp:Literal ID="ltrID" Visible="false" Text='<%#Eval("ID")%>' runat="server"></asp:Literal>
                                            </EditItemTemplate>
                                        </asp:TemplateField>

    这是 我以前写的ASP.NET 代码,ComboBox和DropDownList是相同的,你也可以给它绑定数据源

    后台代码:

      protected void DropPower_SelectedIndexChanged(object sender, EventArgs e)
        {
            ((Literal)((DropDownList)sender).Parent.FindControl("ltrPower")).Text = ((DropDownList)sender).SelectedValue;
        }

    • 已编辑 January0932 2012年12月10日 8:47
    • 已标记为答案 SZLJH 2012年12月10日 10:17
    2012年12月10日 8:45
  • dear

    所以您是说浏览不到任何资料?

    http://www.dotblogs.com.tw/yc421206/archive/2011/08/16/33255.aspx

    之前都是能够被浏览的,不知其他人能否浏览?


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年12月10日 9:08
  • 谢谢余小章老师的热心帮助,你指定的网址里点击链接后,等待一会儿,内容就出来了,第一次进去是我心急,以为链接没反应,只是迟缓了一会还是有内容的,看完里边的代码觉得很有帮助,再次感谢!我是第一次学编程,C#也是我学的第一门编程语言,所以很多问题想不明白,还希望有更多的像你这样的老师来帮助菜鸟^_^


    LJH

    2012年12月10日 10:17
  • 我在网上找到了另外一种思路:在点击到需要显示下拉列表的单元格时,显示一个Combobox,将这个下拉框绑定到提供选项的数据源,并且使之大小刚好适合单元格,然后在selectindexchanged事件中提供将选择值赋给单元格的方法,然后在不需时将这个下拉框隐藏。这个思路也很好,学习了!

    LJH

    2012年12月10日 10:21