C #- 데이터 가능한 콤보 상자를 채우십시오.
-
05-07-2019 - |
문제
나는 많은 양의 예제를 사용할 수있는 Java와 함께 일하는 데 익숙합니다. 여러 가지 이유로 C#으로 전환하고 SharpDevelop에서 다음을 수행하려고했습니다.
// Form has a menu containing a combobox added via SharpDevelop's GUI
// --- Variables
languages = new string[2];
languages[0] = "English";
languages[1] = "German";
DataSet myDataSet = new DataSet();
// --- Preparation
DataTable lTable = new DataTable("Lang");
DataColumn lName = new DataColumn("Language", typeof(string));
lTable.Columns.Add( lName );
for( int i=0; i<languages.Length; i++ ) {
DataRow lLang = lTable.NewRow();
lLang["Language"] = languages[i];
lTable.Rows.Add(lLang);
}
myDataSet.Tables.Add(lTable);
// --- Handling the combobox
mnuActionLanguage.ComboBox.DataSource = myDataSet.Tables["Lang"].DefaultView;
mnuActionLanguage.ComboBox.DisplayMember = "Language";
드롭 다운에서 일부 값을 보았지만 비어 있습니다. 내가 뭘 잘못하고 있는지 말 해주세요; (
편집 : mnuactionlanguage.combobox.databind ()는 인터넷에서 찾은 것이지만 내 경우에는 작동하지 않습니다.
해결책
mnuActionLanguage.ComboBox.BindingContext = this.BindingContext;
결국 문제를 해결했습니다!
해결책
Toolstripcombobox.combobox의 바인딩 컨텍스트를 설정해야합니다.
다음은 Visual Studio를 사용하여 방금 재현 한 코드의 약간 수정 된 버전입니다. 메뉴 항목 콤보 상자는 제 경우에는 ToolStripcombobox1이라고합니다. 바인딩 컨텍스트를 설정하려면 마지막 코드 줄에 유의하십시오.
콤보가 가시 안에있는 경우 공구 스트립이라는 것을 알았습니다. 바인딩은 이것없이 작동하지만 드롭 다운에있을 때는 그렇지 않습니다. 같은 문제가 발생합니까?
이 작업을 수행 할 수 없다면 연락처 페이지를 통해 줄을 삭제하면 프로젝트를 보내 드리겠습니다. SharpDevelop을 사용하여로드 할 수는 없지만 C# Express를 사용합니다.
var languages = new string[2];
languages[0] = "English";
languages[1] = "German";
DataSet myDataSet = new DataSet();
// --- Preparation
DataTable lTable = new DataTable("Lang");
DataColumn lName = new DataColumn("Language", typeof(string));
lTable.Columns.Add(lName);
for (int i = 0; i < languages.Length; i++)
{
DataRow lLang = lTable.NewRow();
lLang["Language"] = languages[i];
lTable.Rows.Add(lLang);
}
myDataSet.Tables.Add(lTable);
toolStripComboBox1.ComboBox.DataSource = myDataSet.Tables["Lang"].DefaultView;
toolStripComboBox1.ComboBox.DisplayMember = "Language";
toolStripComboBox1.ComboBox.BindingContext = this.BindingContext;
다른 팁
string strConn = "Data Source=SEZSW08;Initial Catalog=Nidhi;Integrated Security=True";
SqlConnection Con = new SqlConnection(strConn);
Con.Open();
string strCmd = "select companyName from companyinfo where CompanyName='" + cmbCompName.SelectedValue + "';";
SqlDataAdapter da = new SqlDataAdapter(strCmd, Con);
DataSet ds = new DataSet();
Con.Close();
da.Fill(ds);
cmbCompName.DataSource = ds;
cmbCompName.DisplayMember = "CompanyName";
cmbCompName.ValueMember = "CompanyName";
//cmbCompName.DataBind();
cmbCompName.Enabled = true;
예를 들어 테이블을 만들었습니다.
DataTable dt = new DataTable ();
dt.Columns.Add("Title", typeof(string));
dt.Columns.Add("Value", typeof(int));
테이블에 레코드 추가 :
DataRow row = dt.NewRow();
row["Title"] = "Price"
row["Value"] = 2000;
dt.Rows.Add(row);
또는 :
dt.Rows.Add("Price",2000);
마지막으로 :
combo.DataSource = dt;
combo.DisplayMember = "Title";
combo.ValueMember = "Value";
코드의 뒷부분에서 defaultView에 RowFilter를 적용하고 있습니까? 이로 인해 반환 된 결과가 변경 될 수 있습니다.
직접 참조가있는 경우 객체 속성을 사용하는 데이터 열을 직접 참조하면 문자열을 디스플레이 멤버로 사용하지 않습니다.
mnuActionLanguage.ComboBox.DataSource = lTable.DefaultView;
mnuActionLanguage.ComboBox.DisplayMember = lName.ColumnName;
나는 빈 형태와 표준 콤보로 이것을 시도했으며 나를 위해 효과가있는 것 같습니다.
몇 가지 요점 :
1) "databind ()"은 웹 앱 (Windows 앱이 아님)에만 해당됩니다.
2) 귀하의 코드는 매우 'Javaish'처럼 보입니다 (나쁜 것은 아닙니다. 단지 관찰).
이 시도:
mnuActionLanguage.ComboBox.DataSource = languages;
그것이 작동하지 않는다면 ... 나는 당신의 데이터 소스가 코드의 다른 곳에서 밟고 있다고 가정합니다.
이 라인
mnuActionLanguage.ComboBox.DisplayMember = "Lang.Language";
잘못되었습니다. 변경하십시오
mnuActionLanguage.ComboBox.DisplayMember = "Language";
그리고 그것은 (databind () 없이도) 작동합니다.