方法出现故障

时间:2010-11-23 11:37:30

标签: c# visual-studio

我创建了一个方法,可以将所有表与主键绑定在一个下拉列表中,如下所示

public void PrimaryKeyTable()
        {
 SqlConnection sConnection = new SqlConnection("Server=192.168.10.3;DataBase=GoalPlanNew;User Id=gp;Password=gp");

            //To Open the connection.
            sConnection.Open();

            string selectPrimaryKeys = @"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY'

                                       ORDER BY  TABLE_NAME";

            SqlCommand sCommand = new SqlCommand(selectPrimaryKeys, sConnection);

            try
            {
                DataSet dsListOfPrimaryKeys = new DataSet("INFORMATION_SCHEMA.TABLE_CONSTRAINTS");
                SqlDataAdapter dass = new SqlDataAdapter(selectPrimaryKeys, sConnection);
                dass.TableMappings.Add("Table", "INFORMATION_SCHEMA.TABLE_CONSTRAINTS");
                dass.Fill(dsListOfPrimaryKeys);

                DataViewManager dsvaa = dsListOfPrimaryKeys.DefaultViewManager;
                cmbResults.DataSource = dsListOfPrimaryKeys.Tables["INFORMATION_SCHEMA.TABLE_CONSTRAINTS"];
                cmbResults.DisplayMember = "NAME";
                cmbResults.ValueMember = ("");
            }
            catch (Exception ex)
            {
                //All the exceptions are handled and written in the EventLog.
                EventLog log = new EventLog("Application");
                log.Source = "MFDBAnalyser";
                log.WriteEntry(ex.Message);
            }
            finally
            {
                if (sConnection.State != ConnectionState.Closed)
                {
                    sConnection.Close();
                }
            }
        }

但不是用主键绑定表,而是在下拉列表中给出类似的内容

System.Data.DataRowView
System.Data.DataRowView...and so on

你能指出我出错的地方吗?

2 个答案:

答案 0 :(得分:4)

DisplayMember不应该是“TABLE_NAME”

答案 1 :(得分:2)

名为“NAME”的DataRowView上没有属性。 DisplayMember属性在要绑定的对象上采用属性的字符串名称,并使用反射来获取实际值。您尝试做的是提供“NAME”作为返回列的名称,如果您将其编入索引,则会显示在DataRowView中。

遗憾的是不行。工作边界列表的一个例子:

http://msdn.microsoft.com/en-us/library/system.windows.forms.listcontrol.displaymember.aspx

我不确定你是否可以绑定你的DataRowView而不将它包装在另一个类中,这本身并不是一个繁重的解决方案。

当无法解析DisplayMember时,它默认在绑定对象上运行ToString()DataRowView.ToString()返回类型名称,因为它不会覆盖ToString() - 这就是你的情况正在发生的事情。

更新:道歉,它也适用于数据表的列名。目前我找不到任何相关文档,但如果您将DisplayMember设置为“TABLE_NAME”,它也会有效。我的解释讨论了类属性,这是绑定对象的情况,但它也可以采用索引器值,但我不知道它是如何工作的。

更新2:这是一个很好的概述,CurrencyManager将处理列名称:

http://www.akadia.com/services/dotnet_databinding.html