Без да публикувам целия си код (просто публикувам обидния скрипт), имам проблем, който изглежда като много хора са имали, но моят изглежда не отговаря на други препоръчани корекции. Използвам C# във VS2008.
По принцип имам comboBox и когато елементът init се промени, той отива към кода по-долу. По същество кодът ще определи коя държава е била избрана (myCountryKey) и след това ще предаде това като параметър към съхранена процедура, която попълва следващ comboBox.
Странното е, че свойството selectedValue на cboCountries винаги се показва като Null. Докато четох за този проблем, изглеждаше, че проблемът е свойството dropdownStyle, но промених моето на DropDownList, както беше препоръчано, и това не проработи.
Тъй като често използвам падащи менюта, започнах да си играя и открих, че мога да накарам свойството SelectedIndex да работи и мога да използвам свойството GetItemText, за да работи също (за това са променливите myCountryKey2 и myCountryKey3). Но това, което наистина бих искал, е SelectedValue и съм правил такива неща преди и просто не мога да разбера защо не работи.
Има ли друго свойство на разгъващ се списък, което може да съм променил случайно и което може да накара SelectedValue да не работи?
private void cboCountries_SelectedIndexChanged(object sender, EventArgs e)
{
SqlCommand cmd = null;
SqlDataReader dr = null;
try
{
cmd = util.SqlConn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
myCountryKey = int.Parse(this.cboCountries.SelectedValue.ToString()); //does not work, says value is null
myCountryKey2 = int.Parse(this.cboCountries.SelectedIndex.ToString()); //Works fine
string myCountryKey3 = this.cboCountries.GetItemText(this.cboCountries.SelectedItem).ToString(); //Works fine
cboDivisions.Enabled = true;
cboDivisions.Items.Clear();
// Division parameter
cmd.CommandText = "proc_parms_division";
dr = cmd.ExecuteReader();
while (dr.Read())
this.cboDivisions.Items.Add(new ListItem(dr["division_name"].ToString(), dr["division_key"].ToString()));
dr.Close();
cmd.Parameters.Clear();
}
catch (Exception ex)
{
util.LogError(ex);
MessageBox.Show(ex.Message);
}
finally
{
if (dr != null) dr.Dispose();
if (cmd != null) cmd.Dispose();
}
}
Още код:
public frmWriteoff()
{
InitializeComponent();
//this.KeyPreview = true;
//this.KeyUp += new KeyEventHandler(frmWriteoff_KeyUp);
// Data objects are unmanaged code.
// Declare them above the try{} block and always dispose of them in finally{}.
SqlCommand cmd = null;
SqlDataReader dr = null;
try
{
this.cboCountries.DisplayMember = "Label";
this.cboCountries.ValueMember = "Value";
this.cboDivisions.DisplayMember = "Label";
this.cboDivisions.ValueMember = "Value";
this.cboBusinessUnits.DisplayMember = "Label";
this.cboBusinessUnits.ValueMember = "Value";
this.cboMCCs.DisplayMember = "Label";
this.cboMCCs.ValueMember = "Value";
this.cboNodes.DisplayMember = "Label";
this.cboNodes.ValueMember = "Value";
this.cboProductCodes.DisplayMember = "Label";
this.cboProductCodes.ValueMember = "Value";
// Country parameters
cmd = util.SqlConn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "proc_parms_countries_for_user";
cmd.Parameters.Add("@whoAmI", SqlDbType.VarChar).Value = WindowsIdentity.GetCurrent().Name;
dr = cmd.ExecuteReader();
while (dr.Read())
if (dr["country key"].ToString() != "0" && dr["country key"].ToString() != "1")
{
this.cboCountries.Items.Add(new ListItem(dr["country name"].ToString(), dr["country key"].ToString()));
}
cmd.Parameters.Clear();
dr.Close();
}
catch (Exception ex)
{
util.LogError(ex);
MessageBox.Show(ex.Message);
}
finally
{
if (dr != null) dr.Dispose();
if (cmd != null) cmd.Dispose();
}
}