Вопрос:
У меня есть таблица данных (две таблицы данных, но мы просто предположим, что она есть на данный момент), которые были объявлены при загрузке моего окна, этот DataTable заполнен:
- NoteID
- NoteName
- Заметка
NoteID: первый столбец в моей базе данных SQL, содержащий примечание и идентификатор
NoteName: второй столбец в моей базе данных SQL, дающий примечание имя
Примечание. Это третий и последний столбец, который дает примечание его текст (может быть довольно длинным его VarChar (MAX))
В настоящее время мой DataTable не вызывает проблем, однако я хочу заполнить свой TextBox (Named: textResult) столбцом “Примечание”, связанным с “NoteName”, выбранным в Combo Box.
//Setup connection to server SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); builder.DataSource = «123.123.123.123»; builder.InitialCatalog = «DiscoverThePlanet»; builder.UserID = «TestPerm»; builder.Password = «Test321»; string connectionString = builder.ConnectionString; DataTable dtNotes = new DataTable(); DataTable dtTemplateNotes = new DataTable(); using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); SqlCommand cmdNotes = new SqlCommand(«SELECT NoteID, NoteName, Note FROM Notes», conn); SqlCommand cmdTemplateNotes = new SqlCommand(«SELECT TemplateNoteID, TemplateNoteName, TemplateNote FROM TemplateNotes», conn); SqlDataReader readerNotes = cmdNotes.ExecuteReader(); dtNotes.Columns.Add(«NoteID», typeof(string)); dtNotes.Columns.Add(«NoteName», typeof(string)); dtNotes.Columns.Add(«Note», typeof(string)); dtNotes.Load(readerNotes); SqlDataReader readerTemplateNotes = cmdTemplateNotes.ExecuteReader(); dtTemplateNotes.Columns.Add(«TemplateNoteID», typeof(string)); dtTemplateNotes.Columns.Add(«TemplateNoteName», typeof(string)); dtTemplateNotes.Columns.Add(«TemplateNote», typeof(string)); dtTemplateNotes.Load(readerTemplateNotes); // Temporary loop to see if the DataTable (dt) has any data?!? //foreach (DataRow thisRow in dt.Rows) //{ // MessageBox.Show(thisRow[«NoteName»].ToString()); //} // Define the columns BEFORE setting the item source noteNamesList.SelectedValuePath = «NoteID»; noteNamesList.DisplayMemberPath = «NoteName»; templateNoteNamesList.SelectedValuePath = «TemplateNoteID»; templateNoteNamesList.DisplayMemberPath = «TemplateNoteName»; // Set the ItemSource to my fully loaded data table! noteNamesList.ItemsSource = dtNotes.DefaultView; templateNoteNamesList.ItemsSource = dtTemplateNotes.DefaultView; //DEBUG START //MessageBox.Show(«Hello»); //DEBUG END conn.Close(); }
Как сказано, у меня есть разные Drop Downs, но позволяет просто использовать ту, которая называется dtNotes.
Я новичок в этом, и если я пытаюсь ссылаться на “dtNotes” в любом месте своего кода, он не может его найти?
Мой текстовый редактор XAML, если вам это нужно:
<TextBox x:Name=»textResult» HorizontalAlignment=»Left» Height=»760″ Margin=»42,141,0,0″ TextWrapping=»Wrap» Text=»» VerticalAlignment=»Top» Width=»1494″ AcceptsReturn=»True» TextChanged=»textResult_TextChanged» BorderBrush=»#FF00A9CF» FontFamily=»DengXian» FontSize=»14.667″ Background=»#FFF3FFFE» Grid.ColumnSpan=»2″/>
Combo Box, если вам это нужно:
<ComboBox x:Name=»noteNamesList» HorizontalAlignment=»Left» Height=»28″ Margin=»42,101,0,0″ VerticalAlignment=»Top» Width=»240″ BorderBrush=»White» Opacity=»0.985″ FontFamily=»DengXian» FontSize=»13.333″></ComboBox>
Надеюсь, я предоставил вам достаточно информации, любая помощь очень ценится.
PS Это на WPF
Лучший ответ:
Похоже, вы могли бы объявлять свои данные как локальные переменные для этого метода.
Поместите объявление DataTable в пространство между объявлением пространства Namespace и конструктором класса
Namespace MyProject { public sealed partial class MyClass : Page { //Class wide variables go here DataTable mytable = new DataTable(); class MyClass() { } } }
После этого вы сможете ссылаться на свой DataTable в событии ComboBox.SelectionChanged чтобы присвоить значение TextBox
Редактировать:
В рамках использования события ComboBox.SelectionChanged
TextBox.Text = ComboBox.SelectedValue.ToString();
где TextBox – это имя TextBox для назначения, а ComboBox – это имя ComboBox, из которого вы хотите получить значение.
или, если, например, в вашем случае, это третье значение, которое combobox не может обрабатывать напрямую
TextBox.Text = DataTable.Rows[ComboBox.SelectedIndex][«Note»].ToString() Ответ №1
Вы используете сложный код для загрузки данных из таблицы sql. Вы можете легко использовать SqlConnection и SqlDataAdapter:
SqlConnection conn = new SqlConnection(«Your Connection Settings»); string command=»Select Note FROM Notes Where NoteName='» + comboNoteName.Text + «‘»; SqlDataAdapter da = new SqlDataAdapter(command, conn); DataTable dt = new DataTable(); da.Fill(dt);
Таким образом, DataTable заполняется данными и типами данных, а также таблицей sql. Теперь заполните TextBox:
if(dt.Rows.Count>0) textResult.Text = dt.Rows[0][«Note»].ToString();
Редактировать :
Вы также можете использовать это: вы можете заполнить DataTable один раз в событии Form_Load и часто использовать его там, где это необходимо:
SqlConnection conn = new SqlConnection(«Your Connection Settings»); string command=»Select NoteId, NoteName, Note FROM Notes»; SqlDataAdapter da = new SqlDataAdapter(command, conn); DataTable dt = new DataTable(); da.Fill(dt);
Теперь в событии ComboBox_SelectedIndexChanged поместите его:
if(dt.Rows.Count > 0) textResult.Text = dt.Select(«NoteName='» + comboNoteName.Text + «‘»)[0][«Note»].ToString();