0

UpdateCommand首先,我将展示为 a构建自定义的标准方法DataAdapter(通常在 Select 涉及许多表并且我们不能用来CommandBuilder为 a 自动构建所有命令时使用DataAdapter)。

这是我的 DataAdapter 的代码:

SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT ID, Name FROM MyTable", myConnection);

这是UpdateCommandmyAdapter. 上面的示例仅涉及 1 个单表,但这只是为了简单和演示目的。

myAdapter.UpdateCommand = new SqlCommand("UPDATE MyTable SET ID=@id,Name=@name WHERE ID=@id2", myConnection);
myAdapter.UpdateCommand.Parameters.Add("id", SqlDbType.VarChar).SourceColumn = "ID";
myAdapter.UpdateCommand.Parameters.Add("name", SqlDbType.VarChar).SourceColumn = "Name";
myAdapter.UpdateCommand.Parameters.Add("id2", SqlDbType.VarChar, 20, "ID").SourceVersion = DataRowVersion.Original;

问题是我不想将 the 完全绑定Parameter到 a 上SourceColumn。我想SourceColumn在将值传递给相应的参数之前稍微更改值。例如,我的 ID 列包含所有值,如 1,2,3,4,... 我想在它之前附加一些字符串(例如:000、001、A、B、C...)并通过这个习惯SourceColumn是我的参数。使用上面的代码,传递的值正是SourceColumnID 所具有的:1,2,3,4... 而我想要的是例如:C1,C2,C3,C4,...

那是使用某个中间层的某种解析值,我想知道这是否可能。解析SourceColumn外部的值是可以的,但是在某些情况下我必须在UpdateCommand为我的适配器构建时正确解析它。这是一个案例:

我有一个DataGridView性别列,该列的类型DataGridViewComboBoxColumn有 2 个项目:男性和女性。底层数据源应该有一个对应的 Gender 列,值应该是“Male”和“Female”,所有不匹配的值(不包含在 Items 的列表中ComboBoxColumn)不会使 ComboBoxCell 正确显示值。我试过了CellFormatingCellPainting但没有用。CellPainting太复杂了,CellFormating根本没用。事实上,我没有使用标准的 .NET DataGridView,我使用的是自定义DataGridView(也继承自标准DataGridView)。我所做的一切都DataGridView没有奏效。唯一的解决方案是准备所有基础值以仅包含“男性”和“女性”。Gender列作为布尔/位列。这是选择命令:

SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT ID, Name, CASE WHEN Gender = 1 THEN 'Male' ELSE 'Female' END Gender FROM MyTable", myConnection);

Gender列现在是 varchar 或 text 类型,而不是像我以前那样的布尔值/位。但是Gender原始表中的列是位类型。如何UpdateCommand为上面的 SELECT 命令构建我的?一个解决方案是包含一个隐藏Gender列,并使用该列作为 SourceColumn 来构建 UpdateCommand,可见Gender的只是用于显示。然而,这还有很多工作要做。如果我可以做某种 Custom SourceColumn,那就更好用了。

您的帮助将不胜感激!

4

1 回答 1

0

我不知道这是否有帮助,但我认为你正朝着错误的方向前进。

让 DataGridView 显示您希望如何查看和编辑数据。关于您的“性别”列,您应该能够按如下方式设置您的组合框列:

考虑以下场景:您的数据表有一个“性别”列,其中包含 0(未知)、1(男性)、2(女性)、3(其他)。

这是一个示例代码,它将定义查找、创建示例数据并用数据填充网格。性别将以英文显示,但存储为数字。

    class Employee
    {
        public string Name { get; set; }
        public int Gender { get; set; }
    }
    class GenderLookup
    {
        public string Display { get; set; }
        public int Value { get; set; }
    }

    private void SetupGrid()
    {

    GenderLookup[] _lookups = new[]
        {
            new GenderLookup { Value = 0, Display = "unknown" }, 
            new GenderLookup { Value = 1, Display = "Male" },
            new GenderLookup { Value = 2, Display = "Female" }, 
            new GenderLookup { Value = 3, Display = "Other" }
        };

    Employee[] _employees = new[]
        {
            new Employee() { Gender = 1, Name = "James T. Kirk" }, 
            new Employee() { Gender = 2, Name = "Lt. Uhura" },
            new Employee() { Gender = 3, Name = "Data" }
        };
        GridView.AutoGenerateColumns = false;
        GridView.DataSource = _employees;
        GridView.Columns.Add(
            new DataGridViewTextBoxColumn() 
                { 
                    DataPropertyName = "Name" 
                }
            );

        GridView.Columns.Add(
            new DataGridViewComboBoxColumn()
                {
                    DataSource = _lookups,
                    DisplayMember = "Display",
                    ValueMember = "Value",
                    DataPropertyName = "Gender"
                }
            );
    }

因此,无需手动“解析”(或更好:翻译)性别显示名称。DataGridView 为您的基础数据创建一个“视图”,这可能难以阅读(如本例中的性别信息)。

于 2013-05-22T05:59:26.757 回答