◆急!!在datagrid里面的一个列中用combobox绑定数据的id和name的写法具体怎么做啊?

lian_yi 2010-06-28 04:10:11
注意是在DataGrid控件里绑定列的具体方法啊,我试了很长时间都不行,因为是刚开始接触,所以希望能够解答得细致些,
环境是SL4+RIA的写法,值用id,显示为name,是绑定到数据库表的写法

DataGrid显示例如:

日期 | 业务员(id)| 操作员(id)|。。。。

让业务员和操作员结果显示为name,他们都在人员表中,相当于绑定两次同样的内容,这种方式怎么写才能使两个绑定使用一份数据?提高效率

先谢谢了!!!
...全文
383 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
lian_yi 2010-07-06
  • 打赏
  • 举报
回复
先结贴吧,没全部解决
lian_yi 2010-07-04
  • 打赏
  • 举报
回复
我开始也是想用ObservableCollection,你看到我给注释了吧,因为在下面会报错“错误 1 无法将类型“System.ServiceModel.DomainServices.Client.EntitySet<Luyun.Web.DataModels.vw_client_all>”隐式转换为“System.Collections.ObjectModel.ObservableCollection<Luyun.Web.DataModels.vw_client_all>” F:\lianyi\程序\陆运\Code\WEB\Luyun\Luyun\App.xaml.cs 37 30 Luyun

不知道该怎么写了,所以就用IEnumerable了,应该怎么处理呢?
        public App()
{
InitializeComponent();

// Create a WebContext and add it to the ApplicationLifetimeObjects
// collection. This will then be available as WebContext.Current.
WebContext webContext = new WebContext();
webContext.Authentication = new FormsAuthentication();
//webContext.Authentication = new WindowsAuthentication();
this.ApplicationLifetimeObjects.Add(webContext);

LyDomainContext ly = new LyDomainContext();

ly.Load(ly.GetVw_client_allQuery());
LyClientAll.DB = ly.vw_client_alls; //这里报错

}
Sunpire 2010-07-04
  • 打赏
  • 举报
回复
效率的考虑参考我在8楼的个人看法。

LZ这么写是差不多了,除了代码本身有些小问题之嫌。

public static IEnumerable<vw_client_all> DB { get; set; }
改为
public static List<vw_client_all> DB { get; set; }

public static ObservableCollection<vw_client_all> DB { get; set; }

IEnumerable<T> 是一个接口,一般是使用实际类型较多。

ClientName 是一个多余的临时变量,去掉, FirstOrDefault() 用法不正统

vw_client_all obj = LyClientAll.DB.FirstOrDefault(n => n.sys_id == (string)value);
if(obj != null)
{
return obj.简称 ;
}
else
{
return "some value" ;
}

lian_yi 2010-07-04
  • 打赏
  • 举报
回复
调用部分
<sdk:DataGridTextColumn x:Name="shipper" Binding="{Binding Path=shipper, Converter={StaticResource LyGetClientName }}" Header="发货人" Width="Auto" />
<sdk:DataGridTextColumn x:Name="consignee" Binding="{Binding Path=consignee, Converter={StaticResource LyGetClientName }}" Header="收货人" Width="Auto" />

代码部分,有多少行数据就要转化多少次,感觉效率比较低,因为刚学习几天,也不知道还有什么高效方法(除了在数据库里做视图直接转化外)
    public class LyClientAll
{
public static IEnumerable<vw_client_all> DB { get; set; }
//public static ObservableCollection<vw_client_all> DB1 { get; set; }
}

public class LyGetClientName : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return null;

string ClientName = LyClientAll.DB.Where(n => n.sys_id == (string)value).Select(n => n.简称).FirstOrDefault();
return ClientName;
}


#region IValueConverter 成员


public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}

#endregion
}
Sunpire 2010-07-03
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 lian_yi 的回复:]
Converter 方式已经写出来了,不过感觉这种方式效率不是很高
[/Quote]
发发代码,怎么写的?
老Key 2010-07-03
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 lian_yi 的回复:]
Converter 方式已经写出来了,不过感觉这种方式效率不是很高
[/Quote]没办法,这种效率就不是很高。。。可是目前这种方法是解决问题的最好方法
lian_yi 2010-07-03
  • 打赏
  • 举报
回复
Converter 方式已经写出来了,不过感觉这种方式效率不是很高
lian_yi 2010-07-03
  • 打赏
  • 举报
回复
还有 Converter 的性能效率是否有问题
lian_yi 2010-07-03
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 sunpire 的回复:]
先说不使用 Converter 能不能达到LZ的“IsReadOnly” 的只读要求?

再说 Converter ,数据绑定 是 Silverlight 的核心内容,数据转换IValueConverter 又是数据绑定中的一项重要功能,建议LZ花功夫好好理解,先从看帮助文档开始。

数据绑定
http://msdn.microsoft.com/zh-cn/library/cc27807……
[/Quote]

唉,可能是我表达的不清楚吧,用TextBlock的 Converter 方式如果可以解决就可以不用combox了,两个一起用有些重复,如果只是为了显示,那TextBlock的 Converter 就行了,而且还能解决只读问题,看帮助能解决我就不用问了,有一个日期的列我就是用的Converter 方式转换的显示方式(其实后来发现用stringformat也可以解决),帮助和理论的东西好找,但特定的具体的问题我还是希望有经验的朋友以最直接的代码的方式回答,往往提问者都是不知道具体的代码的实现方式,至少我是这样的,如果看帮助能解决的我肯定都不会问的,如果是我表达的不清,可以远程帮我看看我的代码,也许就明白了
Sunpire 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 lian_yi 的回复:]
因为我还没做用户登录这块,我先写到public App()里了,用了个静态类保存的,

C# code
LyDomainContext ly = new LyDomainContext();

ly.Load(ly.GetVw_client_allQuery());
LyGetClientAll.DB = ly.v……
[/Quote]

楼主要有异步调用的概念才行啊。异步调用完成之后才能将这些数据提供给各个页面的Converter使用。

参考 http://topic.csdn.net/u/20100614/10/5409beb9-4813-4e2a-beb5-926690412805.html
中 8楼、11楼、14楼的回复。

另外,ObservableCollection<T> 不是什么难的东西,是集合的一种,和 List<T> 类似,T是泛型,在这里表示实体类, ObservableCollection<T> 是 Silverlight 中用于绑定给 ItemsSource 时常用的类型,具有“观察通知”的功能(MVVM模式的内容之一)
qq331875641 2010-07-02
  • 打赏
  • 举报
回复
不是的,其实是两个问题,一是绑定id显示为name,二是绑定源的共享问题

数据库里的人员表例如下面:

id name
1 张三
2 李四
3 王五
4 赵六


DataGrid结果里不显示id而显示name,要的结果如下:

日期 | 业务员(id)| 操作员(id)|。。。。
010606 张三 李四
010506 王五 赵六
lian_yi 2010-07-02
  • 打赏
  • 举报
回复
因为我还没做用户登录这块,我先写到public App()里了,用了个静态类保存的,
            LyDomainContext ly = new LyDomainContext();

ly.Load(ly.GetVw_client_allQuery());
LyGetClientAll.DB = ly.vw_client_alls;

LyGetClientAll是个静态类,
你说的ObservableCollection<T>的写法我还不会,能提供一下代码的写法吗?
Sunpire 2010-07-02
  • 打赏
  • 举报
回复
先说不使用 Converter 能不能达到LZ的“IsReadOnly” 的只读要求?

再说 Converter ,数据绑定 是 Silverlight 的核心内容,数据转换IValueConverter 又是数据绑定中的一项重要功能,建议LZ花功夫好好理解,先从看帮助文档开始。

数据绑定
http://msdn.microsoft.com/zh-cn/library/cc278072(v=VS.95).aspx

数据转换
http://msdn.microsoft.com/zh-cn/library/cc278072(v=VS.95).aspx#data_conversions
lian_yi 2010-07-02
  • 打赏
  • 举报
回复
明白,不过 Converter 具体怎么写呢?是不是还要写个类再绑定??还是就用 ComboBox 的绑定就行了呢?能不能给个具体的写法?
Sunpire 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 lian_yi 的回复:]
加TextBlock的方法我试了,但是就显示不了下拉列要显示的内容了呀
[/Quote]
DataGridTemplateColumn 在编辑模式时使用的是 CellEditingTemplate ,在非编辑模式时使用的是 CellTemplate ,LZ能明白么?

在 DataGridTemplateColumn.CellTemplate 中放 TextBlock,同时使用 Converter 显示,
在 DataGridTemplateColumn.CellEditingTemplate 中放 ComboBox
就可以了, 不过会有要点击两次才能激活 ComboBox 的麻烦(有办法解决)
lian_yi 2010-07-02
  • 打赏
  • 举报
回复
加TextBlock的方法我试了,但是就显示不了下拉列要显示的内容了呀
Sunpire 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 lian_yi 的回复:]
下拉列不能设置成只读??DATAGRID设置成只读了,但下拉列还可以弹出来选择,这是什么回事?
[/Quote]
可以。
在 DataGridTemplateColumn.CellTemplate 中放 TextBlock
在 DataGridTemplateColumn.CellEditingTemplate 中放 ComboBox
就可以了, 不过会有要点击两次才能激活 ComboBox 的麻烦(有办法解决)

LZ说的情况是因为虽然
<sdk:DataGridTemplateColumn x:Name="consigneeColumn" IsReadOnly="True" .../>
IsReadOnly 了,但是用的模板还是一个 IsEnabled=True 的 ComboBox ,所以~
lian_yi 2010-07-02
  • 打赏
  • 举报
回复
下拉列不能设置成只读??DATAGRID设置成只读了,但下拉列还可以弹出来选择,这是什么回事?
lian_yi 2010-07-02
  • 打赏
  • 举报
回复
要异步我知道,现在我的那种方法已经可以实现了,我再查查你说的ObservableCollection<T>应该怎么写
lian_yi 2010-07-01
  • 打赏
  • 举报
回复
那应该如何处理呢?
加载更多回复(20)

8,734

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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