Hi Scott,
the ComboBox will not get data right when you set databinding.
It uses a lazy initialization mechanism, and delays the realy getting data
work until it really needs displaying.
It's right to set SelectedItemIndex = -1 after the ComboBox is shown.
Kind regards,
Ying-Shen Yu [MS]
Microsoft Support Engineer
This posting is provided "AS IS" with no warranties, and confers no rights.
You assume all risk for your use. 2001 Microsoft Corporation. All rights
reserved.
--------------------
| From: "Scott Hodson" <
[email protected]>
| References: <
[email protected]>
<
[email protected]>
<#
[email protected]>
<
[email protected]>
| Subject: Re: SelectedIndex = -1 still shows first item selected
| Date: Tue, 2 Sep 2003 23:45:06 -0700
| Lines: 321
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
| Message-ID: <
[email protected]>
| Newsgroups: microsoft.public.dotnet.framework.windowsforms
| NNTP-Posting-Host: ip68-4-169-213.oc.oc.cox.net 68.4.169.213
| Path: cpmsftngxa06.phx.gbl!TK2MSFTNGP08.phx.gbl!tk2msftngp13.phx.gbl
| Xref: cpmsftngxa06.phx.gbl
microsoft.public.dotnet.framework.windowsforms:51686
| X-Tomcat-NG: microsoft.public.dotnet.framework.windowsforms
|
| Here's my code...
|
| private void populateStatuses()
|
| {
|
| string sql = "" +
|
| "SELECT jobStatusGuid AS [id], " +
|
| "jobStatus AS [description] " +
|
| "FROM JobStatus ";
|
| contactBinding = Binder.BindComboBox(comboJobStatus, "JobStatus", sql,
| db.Connection);
|
| comboJobStatus.SelectedIndex = -1;
|
| comboJobStatus.SelectedIndex = -1;
|
| }
|
| BindComboBox() is just a tool I use to bind data to combo boxes, given a
SQL
| statement and a connection.
|
| I am not capturing any events on this combobox.
|
| If I try the 0/-1 tip I get
|
| Unhandled Exception: System.ArgumentOutOfRangeException: Specified
argument
| was out of the range of valid values.
|
| Parameter name: '0' is not a valid value for 'index'.
|
| Your code works because you are setting the listindex on a button click, I
| am trying to set it while the form is loading. Even though I have bound
the
| data to the control it still acts like it doesn't have any data in it
| because when I set the index to 0 it barks at me, and -1/-1 doesn't cause
an
| exception, but it's as if the data is actually loaded into the control at
a
| later time, even though I've already bound it via BindComboBox(). Here is
| what that method does
|
| public static BindingResults BindComboBox(ComboBox box, string tableName,
| string sql, SqlConnection connection)
|
| {
|
| SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);
|
| DataSet dataSet = new DataSet();
|
| SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
|
| adapter.Fill(dataSet, tableName);
|
|
| box.DataSource = dataSet.Tables[tableName];
|
| box.DisplayMember = "description";
|
| box.ValueMember = "id";
|
| return new BindingResults(dataSet, adapter);
|
| }
|
| However, I just got it to work. I called -1/-1 AFTER I show the form,
which
| must force the data bound data to be rendered/filled, then, when I set
-1/-1
| it appears blank. Weird.
|
|
| | > Hi Scott,
| > I've tested on .NET v1.1. the problem of the bounded ComboBox still
| > exists on v1.1 but the work around provided by Herfried works on v1.1,
and
| > I also tried first setting the SelectedIndex to 0 then -1, it didn't
throw
| > exception.
| > Could you tell us more about how you use the ComboBox? What exception
did
| > it throw out? Have you define some event handler on ComboBox?
| > And here is my test code, you may try it and let me know the difference
| > between our codes.(you should change the dataConnection property)
| >
| > thanks!
| >
| > using System;
| > using System.Windows.Forms;
| >
| > namespace ComboBox_SelectedIndex
| > {
| > /// <summary>
| > /// Summary description for Form1.
| > /// </summary>
| > public class Form1 : System.Windows.Forms.Form
| > {
| > private System.Windows.Forms.ComboBox comboBox1;
| > private System.Windows.Forms.Button button1;
| > private System.Data.OleDb.OleDbCommand oleDbSelectCommand1;
| > private System.Data.OleDb.OleDbConnection oleDbConnection1;
| > private System.Data.OleDb.OleDbDataAdapter oleDbDataAdapter1;
| > private ComboBox_SelectedIndex.DataSet1 dataSet11;
| > /// <summary>
| > /// Required designer variable.
| > /// </summary>
| > private System.ComponentModel.Container components = null;
| >
| > public Form1()
| > {
| > //
| > // Required for Windows Form Designer support
| > //
| > InitializeComponent();
| >
| > //
| > // TODO: Add any constructor code after InitializeComponent call
| > //
| > }
| >
| > /// <summary>
| > /// Clean up any resources being used.
| > /// </summary>
| > protected override void Dispose( bool disposing )
| > {
| > if( disposing )
| > {
| > if (components != null)
| > {
| > components.Dispose();
| > }
| > }
| > base.Dispose( disposing );
| > }
| >
| > #region Windows Form Designer generated code
| > /// <summary>
| > /// Required method for Designer support - do not modify
| > /// the contents of this method with the code editor.
| > /// </summary>
| > private void InitializeComponent()
| > {
| > this.comboBox1 = new System.Windows.Forms.ComboBox();
| > this.button1 = new System.Windows.Forms.Button();
| > this.oleDbSelectCommand1 = new System.Data.OleDb.OleDbCommand();
| > this.oleDbConnection1 = new System.Data.OleDb.OleDbConnection();
| > this.oleDbDataAdapter1 = new System.Data.OleDb.OleDbDataAdapter();
| > this.dataSet11 = new ComboBox_SelectedIndex.DataSet1();
| >
((System.ComponentModel.ISupportInitialize)(this.dataSet11)).BeginInit();
| > this.SuspendLayout();
| > //
| > // comboBox1
| > //
| > this.comboBox1.AllowDrop = true;
| > this.comboBox1.DataSource = this.dataSet11.Customers;
| > this.comboBox1.DisplayMember = "ContactTitle";
| > this.comboBox1.DropDownStyle =
| > System.Windows.Forms.ComboBoxStyle.DropDownList;
| > this.comboBox1.Location = new System.Drawing.Point(16, 72);
| > this.comboBox1.Name = "comboBox1";
| > this.comboBox1.Size = new System.Drawing.Size(200, 21);
| > this.comboBox1.TabIndex = 0;
| > this.comboBox1.ValueMember = "Region";
| > //
| > // button1
| > //
| > this.button1.Location = new System.Drawing.Point(40, 224);
| > this.button1.Name = "button1";
| > this.button1.TabIndex = 1;
| > this.button1.Text = "Deselect";
| > this.button1.Click += new System.EventHandler(this.button1_Click);
| > //
| > // oleDbSelectCommand1
| > //
| > this.oleDbSelectCommand1.CommandText = "SELECT Address, City,
| > CompanyName, ContactName, ContactTitle, Country, CustomerID" +
| > ", Fax, Phone, PostalCode, Region FROM Customers";
| > this.oleDbSelectCommand1.Connection = this.oleDbConnection1;
| > //
| > // oleDbConnection1
| > //
| > this.oleDbConnection1.ConnectionString = @"Jet OLEDB:Global Partial Bulk
| > Ops=2;Jet OLEDB:Registry Path=;Jet OLEDB
atabase Locking Mode=1;Jet
| > OLEDB
atabase Password=;Data Source=""C:\Program Files\Microsoft
| > Office\OFFICE11\1033\FPNWIND.MDB"";Password=;Jet OLEDB:Engine Type=5;Jet
| > OLEDB:Global Bulk
Transactions=1;Provider=""Microsoft.Jet.OLEDB.4.0"";Jet
| > OLEDB:System database=;Jet OLEDB:SFP=False;Extended
Properties=;Mode=Share
| > Deny None;Jet OLEDB:New Database Password=;Jet OLEDB:Create System
| > Database=False;Jet OLEDB
on't Copy Locale on Compact=False;Jet
| > OLEDB:Compact Without Replica Repair=False;User ID=Admin;Jet
OLEDB:Encrypt
| > Database=False";
| > //
| > // oleDbDataAdapter1
| > //
| > this.oleDbDataAdapter1.SelectCommand = this.oleDbSelectCommand1;
| > this.oleDbDataAdapter1.TableMappings.AddRange(new
| > System.Data.Common.DataTableMapping[] {
| > new System.Data.Common.DataTableMapping("Table",
| > "Customers", new System.Data.Common.DataColumnMapping[] {
| > new
| > System.Data.Common.DataColumnMapping("Address", "Address"),
| > new
| > System.Data.Common.DataColumnMapping("City", "City"),
| > new
| > System.Data.Common.DataColumnMapping("CompanyName", "CompanyName"),
| > new
| > System.Data.Common.DataColumnMapping("ContactName", "ContactName"),
| > new
| > System.Data.Common.DataColumnMapping("ContactTitle", "ContactTitle"),
| > new
| > System.Data.Common.DataColumnMapping("Country", "Country"),
| > new
| > System.Data.Common.DataColumnMapping("CustomerID", "CustomerID"),
| > new
| > System.Data.Common.DataColumnMapping("Fax", "Fax"),
| > new
| > System.Data.Common.DataColumnMapping("Phone", "Phone"),
| > new
| > System.Data.Common.DataColumnMapping("PostalCode", "PostalCode"),
| > new
| > System.Data.Common.DataColumnMapping("Region", "Region")})});
| > //
| > // dataSet11
| > //
| > this.dataSet11.DataSetName = "DataSet1";
| > this.dataSet11.Locale = new System.Globalization.CultureInfo("en-US");
| > //
| > // Form1
| > //
| > this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
| > this.ClientSize = new System.Drawing.Size(292, 273);
| > this.Controls.Add(this.button1);
| > this.Controls.Add(this.comboBox1);
| > this.Name = "Form1";
| > this.Text = "Form1";
| > this.Load += new System.EventHandler(this.Form1_Load);
| > ((System.ComponentModel.ISupportInitialize)(this.dataSet11)).EndInit();
| > this.ResumeLayout(false);
| >
| > }
| > #endregion
| >
| > /// <summary>
| > /// The main entry point for the application.
| > /// </summary>
| > [STAThread]
| > static void Main()
| > {
| > Application.Run(new Form1());
| > }
| >
| > private void button1_Click(object sender, System.EventArgs e)
| > {
| > comboBox1.SelectedIndex = 0;
| > comboBox1.SelectedIndex = -1;
| > }
| >
| > private void Form1_Load(object sender, System.EventArgs e)
| > {
| > oleDbDataAdapter1.Fill(dataSet11);
| > }
| > }
| > }
| >
| > Kind regards,
| >
| > Ying-Shen Yu [MS]
| > Microsoft Support Engineer
| >
| > This posting is provided "AS IS" with no warranties, and confers no
| rights.
| > You assume all risk for your use. 2001 Microsoft Corporation. All
rights
| > reserved.
| > --------------------
| > | From: "Scott Hodson" <
[email protected]>
| > | References: <
[email protected]>
| > <
[email protected]>
| > | Subject: Re: SelectedIndex = -1 still shows first item selected
| > | Date: Tue, 2 Sep 2003 12:34:45 -0700
| > | Lines: 25
| > | X-Priority: 3
| > | X-MSMail-Priority: Normal
| > | X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
| > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
| > | Message-ID: <#
[email protected]>
| > | Newsgroups: microsoft.public.dotnet.framework.windowsforms
| > | NNTP-Posting-Host: 64-164-53-130.ded.pacbell.net 64.164.53.130
| > | Path: cpmsftngxa06.phx.gbl!TK2MSFTNGP08.phx.gbl!tk2msftngp13.phx.gbl
| > | Xref: cpmsftngxa06.phx.gbl
| > microsoft.public.dotnet.framework.windowsforms:51513
| > | X-Tomcat-NG: microsoft.public.dotnet.framework.windowsforms
| > |
| > | The -1 twice thing didn't work, it still displays the first item, and
| > | setting it to 0 then -1 gave me an exception. This article is for
NET
| > 1.0,
| > | I'm on 1.1. I'm thinking they're emulating HTML combo boxes for
| > | compatibility across Windows Forms and Web Forms.
| > |
| > | | > | > Hello,
| > | >
| > | > > I have a combo box with a DropDownStyle of DropDownList,
| > | > > and when I force SelectedIndex = -1 it still shows the first
| > | > > item as selected. Am I doing something wrong here?
| > | >
| > | >
http://support.microsoft.com/default.aspx?scid=kb;en-us;327244
| > | >
| > | > HTH,
| > | > Herfried K. Wagner
| > | > --
| > | > MVP · VB Classic, VB.NET
| > | >
http://www.mvps.org/dotnet
| > | >
| > | >
| > |
| > |
| > |
| >
|
|
|