gpt4 book ai didi

c# - DataGridView 绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 22:18:32 24 4
gpt4 key购买 nike

我有一个通过通用列表绑定(bind)到的 GridView 。我自己设置了所有列。我只是想:

编辑行时捕获事件 PRE 格式错误 - 通过隐藏字段获取行信息 - 并保留

我确信这一定很简单,但我没有做过太多表单工作,而且我不熟悉它的 DataGridViews 事件。

最佳答案

有两种看待这个问题的方法;

  • 处理CellParsing事件并解析值
  • 在属性上使用自定义TypeConverter

我通常更喜欢后者,因为它将这种逻辑从 UI 中分离出来;我看看是否可以举个例子......


示例(此代码大部分是“显示其工作”代码);在这里,我定义了一个 MyDateTimeConverter,它将日期格式化/解析为其向后“dd MMM yyyy”文本(没有真正好的理由),并将该转换器与其中之一相关联特性。您可以编辑网格中的值,更改将被推回(更改行以查看“实际”值更新)。由于更改通知存在一些细微差别,它不会立即显示;仅仅为了这个而使示例变得更复杂是不值得的......

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Windows.Forms;

class Person
{
public string Forename { get; set; }
public string Surname { get; set; }

[TypeConverter(typeof(MyDateTimeConverter))]
public DateTime EditableValue { get { return ActualValue; } set { ActualValue = value; } }
// this just proves what we have set...
public DateTime ActualValue { get; private set; }
}
class MyDateTimeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
return destinationType == typeof(string) || base.CanConvertTo(context, destinationType);
}
const string FORMAT = "dd MMM yyyy";
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value != null && value is string)
{
string s = (string)value;
return DateTime.ParseExact(Reverse(s), FORMAT, CultureInfo.InvariantCulture);
}
return base.ConvertFrom(context, culture, value);
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string))
{
return Reverse(((DateTime)value).ToString(FORMAT, CultureInfo.InvariantCulture));
}
return base.ConvertTo(context, culture, value, destinationType);
}
static string Reverse(string value)
{
char[] data = value.ToCharArray();
Array.Reverse(data);
return new string(data);
}
}
class MyForm : Form
{
public MyForm()
{
DataGridView grid = new DataGridView();
grid.Dock = DockStyle.Fill;
List<Person> people = new List<Person>();
people.Add(new Person { Forename = "Fred", Surname = "Flintstone", EditableValue = DateTime.Today });
people.Add(new Person { Forename = "Barney", Surname = "Rubble", EditableValue = DateTime.Today.AddDays(-25) });
grid.DataSource = people;
Controls.Add(grid);
}
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new MyForm());
}
}

关于c# - DataGridView 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/634643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com