2015-08-19 53 views
1

我有具有以下属性(字段)域类用户:如何转换字节数组字符串为一个DataGridView

UserId (int) 
UserName (nvarchar(25)) 
SecurePassword (varbinary(32)) 
Salt (varbinary(32)) 

SecurePassword和盐具有32的长度存储一个字节数组,你可以猜到了。 如果我把我的

BindingSource.DataSource = context.Users.Local.ToBindingList(); 

然后我

DataGridView.DataSource = BindingSource; 

我会得到一个错误,告诉我处理DataError事件为GridView。 一旦我用空方法做到这一点,SecurePassword和Salt Columns会为每一行显示[X]。现在

,我可以使用LINQ来呈现,在一个匿名类型:

var data = from u in context.Users 
      select new 
      { 
       u.UserId, 
       u.UserName, 
       SecurePassword = BitConverter.ToString(u.SecurePassword), 
       Salt = BitConverter.ToString(u.Salt) 
      }; 

但我真的不希望匿名类型。 在WPF中,我可以编写一个从IValueConverter继承的Converter,但在WinForms中似乎没有。 任何帮助将不胜感激和欢迎。

回答

2

使用CellFormatting事件。喜欢的东西:

void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    // 2 - Salt, 3 - SecurePassword 
    if (e.ColumnIndex == 2 || e.ColumnIndex == 3) 
    { 
     if (e.Value != null) 
     { 
      byte[] array = (byte[])e.Value; 
      e.Value = BitConverter.ToString(array); 
      e.FormattingApplied = true; 
     } 
     else 
      e.FormattingApplied = false; 
    } 
} 
+0

感谢。我确实需要将AutoGenerateColumns设置为false并手动添加列。尽管如此,它效果很好。 – Randy

1

要建立在对方的回答,最简单的方法我实现了,这是:

  1. 进入您的DataGridView的属性,发现列属性,对其进行编辑,并更改ColumnType的二进制列到DataGridViewTextBoxColumn。
  2. 进入“事件”窗格并在CellFormatting事件上生成一个方法。
  3. 设置方法的代码是这样的:一个提示答案是很好地工作

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    if (e.ColumnIndex == 1 || e.ColumnIndex == 2) 
    { 
     if (e.Value != null) 
     { 
      e.Value = Encoding.UTF8.GetString((byte[]) e.Value); 
      e.FormattingApplied = true; 
     } 
     else 
      e.FormattingApplied = false; 
    } 
} 
相关问题