首先,我将展示为UpdateCommand
构建自定义DataAdapter
的标准方法(通常在Select包含多个表时使用,我们无法使用CommandBuilder
为DataAdapter
)自动构建所有命令。
以下是我的DataAdapter的代码:
SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT ID, Name FROM MyTable", myConnection);
以下是为UpdateCommand
构建标准myAdapter
的代码。上面的例子只涉及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;
问题是我不想完全将Parameter
绑定到SourceColumn
。我希望在将值传递给相应的参数之前稍微更改SourceColumn
的值。例如,我的ID列包含所有值,如1,2,3,4,...我想在它之前附加一些字符串(例如:000,001,A,B,C,...)并传递这个自定义SourceColumn
到我的参数。使用上面的代码,传递的值正是SourceColumn
ID具有的内容:1,2,3,4 ...我想要的是例如:C1,C2,C3,C4,... < / p>
这是使用某个中间层的某种解析值,我想知道这是否可行。在外部解析SourceColumn
的值是可以的,但是有些情况我必须在为我的适配器构建UpdateCommand
时正确解析它。这是一个案例:
我有一个DataGridView
,其中有一列性别,此列的类型为DataGridViewComboBoxColumn
,包含两项:男性和女性。底层数据源应该有一个相应的Gender列,值应该是“Male”和“Female”,所有不匹配的值(不包含在ComboBoxColumn
的Items列表中)都不会使ComboBoxCell显示值正确。我尝试了CellFormating
和CellPainting
,但它没有用。 CellPainting
过于复杂,CellFormating
根本无法运作。事实上,我没有使用标准.NET DataGridView
,我使用的是自定义DataGridView
(也继承自标准DataGridView
)。我对DataGridView
所做的一切都没有用。唯一的解决方案是准备所有基础值,仅包括“男性”和“女性”。但是我将Gender
列设计为布尔/位列。这是SELECT命令:
SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT ID, Name, CASE WHEN Gender = 1 THEN 'Male' ELSE 'Female' END Gender FROM MyTable", myConnection);
Gender
列现在是varchar或text的类型,而不是之前的boolean / bit。但原始表中的Gender
列是位的类型。如何为上面的SELECT命令构建我的UpdateCommand
?解决方案包括隐藏的Gender
列,并使用此列为SourceColumn构建UpdateCommand,可见Gender
仅用于显示。然而,这是一项更多的工作要做。如果我可以做某种自定义SourceColumn
,最好使用。
非常感谢您的帮助!
答案 0 :(得分: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创建了您的基础数据的“视图”,这可能很难阅读(在这种情况下与性别信息一样)。