C#
WinForms
응용 프로그램에서 DataGridView
을 사용하고 있고 사용자가 각 셀에서 동일한 값 집합 중에서 하나를 선택할 수 있도록하려고합니다. 모든 셀에 값 목록을 채우는 방법이 필요하다고 가정합니다.DataGridViewCombobBoxColumn에 값을 채우는 방법
GUI 디자이너를 사용하여 COL_BUSINESS_INDUSTRY
(DataGridViewComboBoxColumn
)을 DataGridView에 추가했습니다. id
및 industryName
두 fiels을 가지고있는 DataTable
를 반환합니다
COL_BUSINESS_INDUSTRY.DataSource = LoadIndustries();
COL_BUSINESS_INDUSTRY.DataPropertyName = "industryName";
COL_BUSINESS_INDUSTRY.DisplayMember = COL_BUSINESS_INDUSTRY.DataPropertyName;
COL_BUSINESS_INDUSTRY.ValueMember = COL_BUSINESS_INDUSTRY.DataPropertyName;
LoadIndustries()
: 생성자에서, 내가하는 나는 다음과 같은 코드를 사용하고, 값 목록으로 선택 상자를 채우려 문제는 내가 이것을 실행할 때 ComboBoxes에 값이 없다는 것입니다.
도 LoadIndustries()
이 으로 설정하지 않고 List<string>
을 반환하려고했으나 작동하지 않았습니다. 나는 또한 List<string>
을 반환 LoadIndustries()
으로,이 일을 시도
,하지만 여전히 운 :
COL_BUSINESS_INDUSTRY.Items.AddRange();
는 분명 내가 뭔가를 잘못하고 있어요하지만 온라인으로 보는 3 시간 이상 지났는데 내가 아무 생각이 없습니다.
왜 내 콤보 상자에 값이 표시되지 않습니까?
편집 :
추가에게 다음 클래스를 값 포함 :
class IndustryObj
{
public string theString { get; set; }
public string theId { get; set; }
public IndustryObj(string id, string s) { theId = id; theString = s; }
public override string ToString() { return theString; }
}
나는를 TAW의 제안에 따라, 나는 여전히 작동하지 않는 다음과 같은 변화를했습니다 다음의 방법으로 산업을 적재한다. 나는 개체의 값을로드하는 것은 잘 작동하고 있음을 보장 할 수 있습니다 :
private static List<IndustryObj> LoadIndustries()
{
var industries = new List<IndustryObj>();
const string sql = "SELECT id, name FROM Industry ORDER BY name";
using (var sqlQuery = new CustomSqlQuery(MyDatabases.Telemarketing, sql))
{
foreach (var record in sqlQuery)
{
industries.Add(new IndustryObj(record[0].ToString(), record[1].ToString()));
}
}
return industries;
}
이 내가 DataGridView를 채우기하고있는 방법이다. 모든 값은 COL_BUSINESS_INDUSTRY
에있는 사람을 제외하고, 미세로드 :
private void LoadBusinesses()
{
COL_BUSINESS_INDUSTRY.DataSource = LoadIndustries();
COL_BUSINESS_INDUSTRY.DataPropertyName = "theString";
COL_BUSINESS_INDUSTRY.DisplayMember = COL_BUSINESS_INDUSTRY.DataPropertyName;
COL_BUSINESS_INDUSTRY.ValueMember = "theId";
const string sql = "SELECT id, company, contact, address, phone, email, status, industry, callbackDate, callbackTime, createdBy, lastUpdatedBy, lockedUntil FROM Business ORDER BY company";
using (var sqlQuery = new CustomSqlQuery(MyDatabases.Telemarketing, sql))
{
var columns = new DataGridViewColumn[]
{
COL_BUSINESS_COMPANY,
COL_BUSINESS_CONTACT,
COL_BUSINESS_ADDRESS,
COL_BUSINESS_PHONE,
COL_BUSINESS_EMAIL,
COL_BUSINESS_STATUS,
COL_BUSINESS_INDUSTRY,
COL_BUSINESS_CALLBACKDATE,
COL_BUSINESS_CALLBACKTIME,
COL_BUSINESS_CREATEDBY,
COL_BUSINESS_LASTUPDATEDBY,
COL_BUSINESS_LOCKEDUNTIL
};
foreach (var record in sqlQuery)
{
dgv_Businesses.Rows.Add(CustomDGVRow.InitializeFromDataReader(true, record, columns));
}
}
}
편집 2 : TAW의 두 번째 제안에 따라, 나는 다음과 같은 일을했습니다. 3
private List<IndustryObj> industryObjects;
private void LoadBusinesses()
{
industryObjects = LoadIndustries();
COL_BUSINESS_INDUSTRY.DataSource = industryObjects;
COL_BUSINESS_INDUSTRY.DataPropertyName = "theString";
COL_BUSINESS_INDUSTRY.DisplayMember = COL_BUSINESS_INDUSTRY.DataPropertyName;
COL_BUSINESS_INDUSTRY.ValueMember = "theId";
...
편집 : 이것은 도움이되지 않았다 Luminous
실제로 그것을 가지고,하지만 그건 다른 문제의 번호를 소개합니다. 로딩 방법은 지금과 같다 : 당신이 볼 수 있듯이
private void LoadBusinesses()
{
// Load the records.
const string sql =
"SELECT id, company, contact, address, phone, email, status, industry, callbackDate, callbackTime, createdBy, lastUpdatedBy, lockedUntil FROM Business ORDER BY company";
using (var sqlQuery = new CustomSqlQuery(MyDatabases.Telemarketing, sql))
{
var columns = new DataGridViewColumn[]
{
COL_BUSINESS_COMPANY,
COL_BUSINESS_CONTACT,
COL_BUSINESS_ADDRESS,
COL_BUSINESS_PHONE,
COL_BUSINESS_EMAIL,
COL_BUSINESS_STATUS,
COL_BUSINESS_INDUSTRY,
COL_BUSINESS_CALLBACKDATE,
COL_BUSINESS_CALLBACKTIME,
COL_BUSINESS_CREATEDBY,
COL_BUSINESS_LASTUPDATEDBY,
COL_BUSINESS_LOCKEDUNTIL
};
foreach (var record in sqlQuery)
{
dgv_Businesses.Rows.Add(CustomDGVRow.InitializeFromDataReader(true, record, columns));
}
}
// Load the industries and bind the industry DataSource to the industry ComboBoxColumn.
COL_BUSINESS_INDUSTRY.DataSource = LoadIndustries();
COL_BUSINESS_INDUSTRY.DataPropertyName = "theString";
COL_BUSINESS_INDUSTRY.DisplayMember = COL_BUSINESS_INDUSTRY.DataPropertyName;
COL_BUSINESS_INDUSTRY.ValueMember = "theId";
// Select the correct industries in the industry column.
foreach (var rawRow in dgv_Businesses.Rows)
{
var row = rawRow as CustomDGVRow;
if (row == null) continue;
foreach (var item in ((CustomDGVComboBoxCell) row.Cells[COL_BUSINESS_INDUSTRY.Index]).Items)
{
var industry = item as IndustryObj;
if (industry == null) continue;
if (row.Cells[COL_BUSINESS_INDUSTRY.Index].Value != null && industry.theId == row.Cells[COL_BUSINESS_INDUSTRY.Index].Value.ToString())
{
row.Cells[COL_BUSINESS_INDUSTRY.Index].Value = industry;
}
}
}
}
, 나는 또한 데이터베이스에서 해당 ID를 기반으로 항목 목록에서 하나 개의 값을 선택해야합니다. 나는 (Luminous
의 제안에 따라) 항목을로드 한 후에 만 데이터 소스를 바인딩하기 때문에 행을 다른 패스로 전달하고 각 행에 올바른 산업 가치를 설정해야합니다. 그러나, 행 수가 매우 많기 때문에 이것은 매우 비쌉니다.
- 가 어떻게 올바른 값을 설정하는 또 다른 패스를 일을 피할 수 있습니다 : 그래서 수상 현상금을 위해, 나는 두 개의 추가 질문에 대한 답변을해야합니까?
- 왜 처음에는 행을로드 한 다음 데이터 소스 만 바인딩해야합니까? 이것은 다소 비현실적이며 내 문제를 일으킨다. 요구 사항으로 인해 초기로드 후 어느 시점에 더 많은 데이터가로드되도록 요청하면 어떻게됩니까? 바인딩을 다시해야합니까?
_COL_BUSINESS_INDUSTRY.DataSource = LoadIndustries(); _이 컴파일합니까? 변수를 변수에 넣고 해당 변수에 데이터 소스를 설정하십시오. 필자는 시스템이 언제나 함수에서 가져와야하는 DataSource로 어떻게 작동하는지 상상할 수 없습니다 .. – TaW
오류나 경고없이 컴파일됩니다. 나는 당신이 최신 편집에서 볼 수 있듯이 여전히 운이 없다 이것을 시도했다. 다른 아이디어? 나는 가능한 한 빨리 일할 필요가 있기 때문에이 현상금을 공개했다. –
드롭 다운 열 imo 앞에 행을로드하는 것은 의미가 없습니다. 그 열 유형의 요점은 가치있는 안전한 입력 및 편집을 허용하는 것입니다. 다른 잘못된 것이 있어야합니다. – TaW