DataGridView не загружает данные программно

== тесты для ссылочного равенства (независимо от того, являются ли они одним и тем же объектом).

.equals() тесты для равенства значений (независимо от того, являются ли они логически «равными»).

Objects.equals () проверяет наличие null перед вызовом .equals(), поэтому вам не нужно (доступно с JDK7, также доступным в Guava ).

String.contentEquals () сравнивает содержимое String с содержимым любого CharSequence (доступно с Java 1.5).

Следовательно, если вы хотите проверить, имеет ли две строки одно и то же значение, вы, вероятно, захотите использовать Objects.equals().

// These two have the same value
new String("test").equals("test") // --> true 

// ... but they are not the same object
new String("test") == "test" // --> false 

// ... neither are these
new String("test") == new String("test") // --> false 

// ... but these are because literals are interned by 
// the compiler and thus refer to the same object
"test" == "test" // --> true 

// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true

// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true

Вы почти всегда хотите использовать Objects.equals(). В редкой ситуации, когда вы знаете, что имеете дело с интернированными строками, вы можете использовать ==.

Из JLS 3.10. 5. Строковые литералы :

Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса String. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений ( §15.28 ), «интернированы», чтобы обмениваться уникальными экземплярами, используя метод String.intern.

. Подобные примеры также можно найти в JLS 3.10.5-1 .

0
задан Jimi 17 January 2019 в 12:27
поделиться

1 ответ

Вы можете установить DataGridView.DataSource на null перед установкой нового.
Это приведет к тому, что DataGridView обновит свое содержимое новыми данными в источнике List<Inputs>:
базовый DataGridViewDataConnection сбрасывается только тогда, когда [117 ] ссылка отличается от текущей или имеет значение null.

Обратите внимание, что при сбросе DataSource событие RowsRemoved вызывается несколько раз (по одному разу для каждой удаляемой строки).

Я предлагаю изменить List на BindingList , потому что любое изменение в Списке будет отражено автоматически и потому что оно позволит удалять строки из DataGridView, если / когда это потребуется: использование List<T> в качестве источника данных не позволит удалить строку.

BindingList<Inputs> InputData = new BindingList<Inputs>();

Вы всегда можете установить свойства AllowUserToDeleteRows и AllowUserToAddRows в false, если вы не хотите, чтобы ваши пользователи вмешивались в содержимое сетки.

Например:

public class Inputs
{
    public string Name { get; set; }
    public string Value { get; set; }
}

internal BindingList<Inputs> InputData = new BindingList<Inputs>();

private void Form1_Load(object sender, EventArgs e)
{
    dataGridView1.DataSource = InputData;
}

private void btnAddInput_Click(object sender, EventArgs e)
{
    string textValue = txtInput.Text.Trim();
    if (!string.IsNullOrEmpty(textValue))
    {
        InputData.Add(new Inputs() {
            Name = textValue,
            Value = "[Whatever this is]"
        });
        txtInput.Text = "";
    }
    else
    {
        MessageBox.Show("Not a valid value");
    }
}

Если вы хотите продолжать использовать List<T>, добавьте код, необходимый для сброса DataGridView.DataSource:

private void btnAddInput_Click(object sender, EventArgs e)
{
    if (!string.IsNullOrEmpty(textValue))
    {
        //(...)
        dataGridView1.DataSource = null;
        dataGridView1.DataSource = InputData;
        txtInput.Text = "";
    }
    //(...)
0
ответ дан Jimi 17 January 2019 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: