none
怎么将表的列名绑定到Combobox RRS feed

  • 问题

  • Dim ds as TMSdomainservice=new TMSdomainservice
    combobox1.itemsource=ds.members
    combobox1.displaypath="userid"

    dim Query =FROM d in ds.members where d.userid="A001" select d       '可以确保肯定有一条满足条件
    datagrid1.itemsource=Query

    ds.load(ds.getmemberquery())

    现在有二个问题,求教各位老大
    1,怎么让Combobox1绑定到ds.members的所有列名
    2,上面Datagrid1绑定的语句不会报错,但没有数据 ,,,当我随意单击列头,,,那条数据才会显示出来,怎么解决呢?

    • 已编辑 EmmyX 2010年6月29日 13:52
    2010年6月28日 14:52

答案

  • 通过反射获取到对象的属性,然后绑定到控件上就OK了。

     

    public class User

    {

        public string Address{get;se;}

       public string Email{get;set;}

       public string UserID{get;set;}

    }

     

    var properties=typeof(User).GetProperty();

     

    得到的就是一个数组,绑定上控件就可以了,以上代码是随意写的,不保证正确性,请LZ自己验证,方案是可行的。


    BLOG:http://beniao.cnblogs.com MSN:beniao@live.cn
    • 已建议为答案 beniao 2010年7月8日 14:26
    • 已标记为答案 EmmyX 2010年7月8日 15:42
    2010年7月8日 14:26

全部回复

  • 顶,,,我也碰到这个问题,,,
    不吝赐教
    2010年6月29日 2:10
  • Hi,

       我不是很理解你的第一个问题,你是指要让下拉框里显示所有的Properties?这样的话你可以自定义combo的itemtemplate.

       因为在load的时候你的query不能保证有值,只有当load complete以后query执行才有值,你可以在completed事件中给datagrid的itemsSource赋值。

    2010年6月30日 4:26
  • Hi,版主,第一个问题呢,应该就是你说的Properties,,,因为它们本来就是Table里的列的名称,,,更习惯成为表的列名。。。

    还想多问一句,怎么自定义Itemtemplate?定义成什么呢?不明白啊。。。有没有三,二行代码,参考一下

     

    2010年6月30日 13:23
  • 你好,

           ItemTemplate指的是,你绑定的每个值会以什么样的方式显示在UI界面上。

           比如你的Combo:

             <ComboBox>
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="This is test"></TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>

           这样的话,所有的下拉选项内容都是This is test.可以替换为:

           <TextBlock Text="{Binding PropertyName}"></TextBlock> 这样每个下拉选项都会显示你绑定的某一个列的值

           同理你也可以放多个textblock或者放其他的东西

    2010年7月5日 1:48
  • 你好,

           ItemTemplate指的是,你绑定的每个值会以什么样的方式显示在UI界面上。

           比如你的Combo:

             <ComboBox>
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="This is test"></TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>

           这样的话,所有的下拉选项内容都是This is test.可以替换为:

           <TextBlock Text="{Binding PropertyName}"></TextBlock> 这样每个下拉选项都会显示你绑定的某一个列的值

           同理你也可以放多个textblock或者放其他的东西

    用Combobox绑定某一个列的值,,,发贴前就会了,,,我的问题是Combobox怎么绑定列的名称,,,不是列的值,,,,举例如下

    Friend NotInheritable Class MemberUserMetadata
            Private Sub New()
                MyBase.New
            End Sub
            Public Property Address As String
            Public Property Email As String
            Public Property UserID As Integer
        End Class

    上面是我的MemberUser的表的定义,,,我希望Address,Email,UserID出现在Combobox的下拉框里。。。

    2010年7月5日 12:44
  • 你好,

         不是很明白,你希望列名出现在哪里,但是一般只需要改变template就可以了,下边这个template每个下拉相都会显示所有的3个属性值,并且带有属性名。

         <ComboBox>
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                       <StackPanel>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="Address: "><TextBlock Text="{Binding Address}"></TextBlock>
                        </StackPanel>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="Email: "><TextBlock Text="{Binding Email}"></TextBlock>
                        </StackPanel>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="UserId: "><TextBlock Text="{Binding UserId}"></TextBlock>
                        </StackPanel>
                      </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>

    2010年7月7日 6:45
  • 非常感谢版主不厌其烦,,,

    简单点说,我希望用户在IE里运行时,单击这个Combobox,,,在下拉框里显示的是
    Address
    Email
    UserID

    但我又不希望是这样手工添加上去的
    combobox.items.add "Address"
    combobox.items.add "Email"
    combobox.items.add "UserID"

    因为我有多个表,不想手工添加,不够灵活。。。

     

    2010年7月7日 14:37
  • 你可以遍历你的ds.members所有的列名吧,然后作为数据源绑定到Combox
    2010年7月8日 8:06
  • 非常感谢版主不厌其烦,,,

    简单点说,我希望用户在IE里运行时,单击这个Combobox,,,在下拉框里显示的是
    Address
    Email
    UserID

    但我又不希望是这样手工添加上去的
    combobox.items.add "Address"
    combobox.items.add "Email"
    combobox.items.add "UserID"

    因为我有多个表,不想手工添加,不够灵活。。。

     


    小唐的代码你稍改下就能达到你的要求了嘛:

         <ComboBox>
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                       <StackPanel>
                        <StackPanel 
                            <TextBlock Text="Address: "><TextBlock Text="{Binding Address}"></TextBlock>
                        </StackPanel>
                        <StackPanel 
                            <TextBlock Text="Email: "><TextBlock Text="{Binding Email}"></TextBlock>
                        </StackPanel>
                        <StackPanel 
                            <TextBlock Text="UserId: "><TextBlock Text="{Binding UserId}"></TextBlock>
                        </StackPanel>
                      </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
    最后效果是:

    Address
    Email
    UserID

    Address
    Email
    UserID

    Address
    Email
    UserID

    2010年7月8日 11:13
  • 通过反射获取到对象的属性,然后绑定到控件上就OK了。

     

    public class User

    {

        public string Address{get;se;}

       public string Email{get;set;}

       public string UserID{get;set;}

    }

     

    var properties=typeof(User).GetProperty();

     

    得到的就是一个数组,绑定上控件就可以了,以上代码是随意写的,不保证正确性,请LZ自己验证,方案是可行的。


    BLOG:http://beniao.cnblogs.com MSN:beniao@live.cn
    • 已建议为答案 beniao 2010年7月8日 14:26
    • 已标记为答案 EmmyX 2010年7月8日 15:42
    2010年7月8日 14:26
  • 通过反射获取到对象的属性,然后绑定到控件上就OK了。

     

    public class User

    {

        public string Address{get;se;}

       public string Email{get;set;}

       public string UserID{get;set;}

    }

     

    var properties=typeof(User).GetProperty();

     

    得到的就是一个数组,绑定上控件就可以了,以上代码是随意写的,不保证正确性,请LZ自己验证,方案是可行的。


    BLOG:http://beniao.cnblogs.com MSN:beniao@live.cn


    总算有人明白我的意思了,,,我是第二次听到说用反射,,,非常感谢。。。结贴了

     

    2010年7月8日 15:42
  • 呵呵,反射是肯定可以实现的,以前遇到这种需求我全部是通过反射实现的 。
    BLOG:http://beniao.cnblogs.com MSN:beniao@live.cn
    2010年7月9日 13:45
  • 呵呵,,,多说一句,,,反射是可以,,,但不够灵活啊,,,比如

    dim Query = From t in DS Select t
    dim Query = From t in DS Select t.UserID,t.Address

    我有一个Datagrid,一个Combobox,,,
    Datagrid绑定到一个数据表了,可能包括全部的表列名,也可能只是部分表列名,,,

    但我只希望Combobox里只显示出Datagrid绑定的那部分表列名,有什么方法,,,
    (循环访问Datagrid的Columns.header,我已经会了,,,)

     

    2010年7月11日 3:44