简体   繁体   中英

WinForms DataGridView, and Using DataGridViewColumns

I've got some odd behavior that I'm not getting an error on, but it's not working like I intend.

I'm using a datagridview, and 2 datagridviewcomboboxcolumns.

The first combobox works correctly, but when I add the column binding on the second one, the first combo box quits working, as it seems not selectable, and the dropdown doesn't work and the second one continues to work but doesn't have a value returned (this is a clue, I think ;)). I'm just not quite understanding what I'm missing or not doing correctly.

image: view of program

here is the relevant coding:

DataTable Fill:

public static DataTable ParseCitiesToDataTable()
{
DataTable dataCities = new DataTable();
dataCities.Clear();
dataCities.TableName = "CityList";
dataCities.Columns.Add("Type");
dataCities.Columns.Add("City");
dataCities.Columns.Add("Coord");
dataCities.Columns.Add("BattleCity");
dataCities.Columns.Add("Dist");
dataCities.Columns.Add("Speed");
dataCities.Columns.Add("TimeSec");
dataCities.Columns.Add("SendTime");
dataCities.Columns.Add("TimeTilSend");

foreach (City city in userCities)
{
     DataRow _cityDetails = dataCities.NewRow();
            _cityDetails["Type"] = "None";
            _cityDetails["City"] = city.strCityName;
            _cityDetails["Coord"] = city.strCityCoord;
            _cityDetails["BattleCity"] = "";
            _cityDetails["Dist"] = "0";
            _cityDetails["Speed"] = "Ram";
            _cityDetails["TimeSec"] = "";
            _cityDetails["SendTime"] = "";
            _cityDetails["TimeTilSend"] = "0";
            dataCities.Rows.Add(_cityDetails);
        }}

button click function:

private async void btn_GetMyCities_Click(object sender, EventArgs e)
    {
        btnGetCities.Hide(); // hide button pressed and show progress bar
        await Task.Delay(1000);
        // 
        userCities.Clear();
        if (dtCities != null && dtCities.Rows.Count > 0)
            dtCities.Clear();
        int intPages;
        strUserID = txtUserID.Text;
        if (strUserID.Length > 0)
        {
            pBarWebPull = new ProgressBar();
            gbxInternetLookup.Controls.Add(pBarWebPull);
            pBarWebPull.Width = 260;
            pBarWebPull.Top = 15;
            pBarWebPull.Left = 5;
            pBarWebPull.Value = 0;
            pBarWebPull.Visible = true;
            pBarWebPull.BringToFront();
            pBarWebPull.Show();
            string strWorld = txtUserWorld.Text.ToLower();
            string strWebPageURLBase = "http://tw2stats.com/world/" + strWorld + "/player/" + strUserID + "/towns";
            // get page count
            intPages = ReturnNumberOfLookupPages(strWebPageURLBase);
            string[] strCitiesArray;
            strCitiesArray = GetWebPageCities(strWebPageURLBase, intPages);
            dtCities = ParseCitiesToDataTable();
            bindingSourceCities.DataSource = dtCities;
            dGVCities.DataSource = bindingSourceCities;
            dGVCities.Sort(this.dGVCities.Columns["City"], ListSortDirection.Ascending);
            dGVCities.Columns[1].ReadOnly = true;
            gbxInternetLookup.Controls.Remove(pBarWebPull);

        }
        else
        {
            MessageBox.Show("Please Enter your Tribal Wars 2 ID");
        }
        btnGetCities.Show();
    }

private void InitCitiesDataGridView()
    {
        DataGridViewComboBoxColumn comboBoxCol = new DataGridViewComboBoxColumn();
        comboBoxCol.HeaderText = "Attk Type";
        comboBoxCol.DataSource = AttackTypeChoice.GetChoices();
        comboBoxCol.DisplayMember = "Name";
        comboBoxCol.ValueMember = "Value";
        comboBoxCol.DefaultCellStyle.NullValue = "None";
        comboBoxCol.DefaultCellStyle.DataSourceNullValue = "None";
        comboBoxCol.ValueType = typeof(string);
        dGVCities.Columns.Add(comboBoxCol);
        dGVCities.Columns[0].Name = "Type";
        dGVCities.Columns[0].Width = 65;
        dGVCities.Columns[0].SortMode = DataGridViewColumnSortMode.Programmatic;
        dGVCities.Columns.Add("City", "City");
        dGVCities.Columns[1].SortMode = DataGridViewColumnSortMode.Programmatic;
        dGVCities.Columns[1].Width = 120;
        dGVCities.Columns.Add("Coord", "Coord");
        dGVCities.Columns[2].Width = 60;
        dGVCities.Columns[2].SortMode = DataGridViewColumnSortMode.Programmatic;
        dGVCities.Columns.Add("BattleCity", "Attk City");
        dGVCities.Columns[3].Width = 75;
        dGVCities.Columns[3].SortMode = DataGridViewColumnSortMode.Programmatic;
        dGVCities.Columns.Add("Dist", "Dist");
        dGVCities.Columns[4].Width = 60;
        dGVCities.Columns[4].SortMode = DataGridViewColumnSortMode.Programmatic;
        DataGridViewComboBoxColumn comboBoxCol1 = new DataGridViewComboBoxColumn();
        comboBoxCol1.HeaderText = "Speed";
        comboBoxCol1.DataSource = TroopTypeChoice.GetChoices();
        comboBoxCol1.DisplayMember = "Name";
        comboBoxCol1.ValueMember = "Value";
        comboBoxCol1.DefaultCellStyle.NullValue = "Ram";
        comboBoxCol1.DefaultCellStyle.DataSourceNullValue = "Ram";
        comboBoxCol1.ValueType = typeof(string);
        dGVCities.Columns.Add(comboBoxCol1);
        dGVCities.Columns[5].Name = "Speed";
        dGVCities.Columns[5].Width = 80;
        dGVCities.Columns[5].SortMode = DataGridViewColumnSortMode.Programmatic;
        dGVCities.Columns.Add("TimeSec", "Time (sec)");
        dGVCities.Columns[6].Width = 50;
        dGVCities.Columns[6].SortMode = DataGridViewColumnSortMode.Programmatic;
        dGVCities.Columns.Add("Span", "Span d:h:m:s");
        dGVCities.Columns[7].Width = 65;
        dGVCities.Columns[7].SortMode = DataGridViewColumnSortMode.Programmatic;
        dGVCities.Columns.Add("SendDT", "Send Date");
        dGVCities.Columns[8].Width = 120;
        dGVCities.Columns[8].SortMode = DataGridViewColumnSortMode.Programmatic;
        dGVCities.Columns.Add("TimeTilSend", "Till Send");
        dGVCities.Columns[9].Width = 70;
        dGVCities.Columns[9].SortMode = DataGridViewColumnSortMode.Programmatic;
        dGVCities.Columns[0].DataPropertyName = "Type";
        dGVCities.Columns[1].DataPropertyName = "City";
        dGVCities.Columns[2].DataPropertyName = "Coord";
        dGVCities.Columns[3].DataPropertyName = "BattleCity";
        dGVCities.Columns[4].DataPropertyName = "Dist";
        dGVCities.Columns[5].DataPropertyName = "Speed";
        dGVCities.Columns[6].DataPropertyName = "TimeSec";
        dGVCities.Columns[7].DataPropertyName = "SendTime";
        dGVCities.Columns[8].DataPropertyName = "TimeTilSend";
}

When this is added in it stops working. So the problem is either in the first comboboxcolumn or the second.

dGVCities.Columns[5].DataPropertyName = "Speed";

dGVCities.Columns[1].ReadOnly = true;

was the problem. The column [1] should of been the city name. when i replaced it with

dGVCities.Columns["City"].ReadOnly = true;

the column started working. I decided to try this after i noticed that the city name column was allowing input, which i didn't want, and after the modification, the problem went away.

I guess the takeaway from this is, use named columns where possible so you don't inadvertently access the wrong column.

Sorry for the bother.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM