У меня есть список, в котором мне нужно отображать отдельные метки.
public void LoadContent()
{
TDFnEtlGetTargetVariableList tdFnEtlGetTargetVariableList =
TDFunctions.FnEtlGetTargetVariable.Execute(database, SelectedExportConnectionId, lang, false);
lstTargetVariable.DataSource = tdFnEtlGetTargetVariableList.Items.Select(a => a.Label).Distinct().ToList(); ;
lstTargetVariable.DisplayMember = "Label";
}
Однако, когда я пишу это, как в коде ниже, в строке TDFnEtlGetTargetVariable selectedTargetVariable =(TDFnEtlGetTargetVariable)lstTargetVariable.SelectedItem;
он говорит мне, что «объект типа System.String не может быть преобразован в тип TDFnGetTargetVariable (TDFnGetTargetVariable — это DataRow).
private void LstTargetVariable_SelectedIndexChanged(object sender, EventArgs e)
{
TDFnEtlGetTargetVariable selectedTargetVariable = (TDFnEtlGetTargetVariable)lstTargetVariable.SelectedItem;
TargetVariableMetadataJson targetVariableMetadataJson = new TargetVariableMetadataJson();
targetVariableMetadataJson.LoadFromText(selectedTargetVariable.MetadataString);
cmbStateOrChange.DataSource = targetVariableMetadataJson.Data;
cmbStateOrChange.DisplayMember = "state_or_change_label_cz";
cmbUnit.DataSource = targetVariableMetadataJson.Data;
cmbUnit.DisplayMember = "unit_label_cz";
}
Как я могу это исправить, пожалуйста?
Я прошу прощения за мои очень ограниченные знания и спасибо за ваш ответ. Если я удалю это: .Select(a => a.Label).Distinct().ToList() У меня нет отдельных меток, но код работает. Но мне нужны разные ярлыки.
Существует перегрузка Distinct
, которая использует EqualityComparer. Вы можете реализовать тот, который использует метку в логике сравнения, чтобы ваш результат содержал нужные вам объекты, а не просто строки. Посмотреть пример
Спасибо, Краукодер! Я уже пробовал EqualityComparer, но неправильно написал. Я попробовал еще раз и именно в этот раз! Результат:
public class TDFnEtlGetTargetVariableComparer : IEqualityComparer<TDFnEtlGetTargetVariable>
{
public bool Equals(TDFnEtlGetTargetVariable x, TDFnEtlGetTargetVariable y)
{
return x.Label == y.Label;
}
public int GetHashCode(TDFnEtlGetTargetVariable obj)
{
return obj.Label.GetHashCode();
}
}
public void LoadContent()
{
TDFnEtlGetTargetVariableList tdFnEtlGetTargetVariableList =
TDFunctions.FnEtlGetTargetVariable.Execute(database, SelectedExportConnectionId, lang, false);
lstTargetVariable.DataSource = tdFnEtlGetTargetVariableList.Items.Distinct(new TDFnEtlGetTargetVariableComparer()).ToList();
lstTargetVariable.DisplayMember = "Label";
}
Я очень извиняюсь за плохое форматирование кода, но это просто происходит, когда я вставляю скопированный код, и я не знаю, как сделать правильный отступ.
Чтобы повторить ошибку, ваш список содержит строки, отличные от TDFnEtlGetTargetVariables. Возможно, вы хотите получить доступ к выбранному индексу и использовать его для получения строки данных из вашего источника данных.