Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
tuchin
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 69
1

Как сделать так, чтобы в столбце таблицы был текст, а не число?

12.02.2017, 17:52. Просмотров 924. Ответов 14
Метки нет (Все метки)

В программе
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Windows.Forms;
 
namespace ContactsTest
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }
 
    private OleDbConnection cn;
    private DataSet ds = new DataSet();
    private BindingSource bsMain  = new BindingSource();
    private BindingSource bsChild = new BindingSource();    
    private OleDbDataAdapter daContact;
    private OleDbDataAdapter daPhone;
    private OleDbDataAdapter daTypePhone;
 
     private void DBcon(String DBname)
    {
      cn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + 
                                "\\\" + DBname);
      try
      {
        cn.Open();
      }
      catch
      {
        MessageBox.Show("Ошибка соединения с базой данных " + """ + DBname + """, "Ошибка подключения к базе",
                         MessageBoxButtons.OK, MessageBoxIcon.Error);
        Application.Exit();
      }
    }
 
    private void FillTables()
    {
      daContact.Fill(ds.Tables[0]);
      daTypePhone.Fill(ds.Tables[1]);
      daPhone.Fill(ds.Tables[2]);
    }
 
    private void Form1_Load(object sender, EventArgs e)
    {
      DBcon("Contacts.mdb");
      daContact = new OleDbDataAdapter("SELECT *FROM tblContact", cn);
      ds.Tables.Add();
      daContact.FillSchema(ds.Tables[0], SchemaType.Mapped); 
      daTypePhone = new OleDbDataAdapter("SELECT * FROM tblTypePhone", cn);
      ds.Tables.Add();
      daTypePhone.FillSchema(ds.Tables[1], SchemaType.Mapped);
      daPhone = new OleDbDataAdapter("SELECT *FROM tblPhone", cn);
      ds.Tables.Add();
      daPhone.FillSchema(ds.Tables[2], SchemaType.Mapped); 
      DataRelation ContactPhoneRel = new DataRelation("RelContactPhone", ds.Tables[0].Columns[0], ds.Tables[2].Columns[1]);
      ds.Relations.Add(ContactPhoneRel);
      DataRelation TypePhonePhoneRel = new DataRelation("RelTypePhonePhone", ds.Tables[1].Columns[0], ds.Tables[2].Columns[3]);
      ds.Relations.Add(TypePhonePhoneRel);
      dataGridView1.DataSource = bsMain;
      dataGridView2.DataSource = bsChild;
      bsMain.DataSource = ds;
      bsMain.DataMember = ds.Tables[0].TableName;
      bsChild.DataSource = bsMain;
      bsChild.DataMember = ds.Relations[0].RelationName;
      FillTables();
      OleDbCommandBuilder cmdContacts  = new OleDbCommandBuilder(daContact);
      OleDbCommandBuilder cmdPhone     = new OleDbCommandBuilder(daPhone);
    }
 
    private void btnSave_Click(object sender, EventArgs e)
    {
      daContact.Update(ds.Tables[0]);
      daTypePhone.Update(ds.Tables[1]);
    }
 
    private void btnRefresh_Click(object sender, EventArgs e)
    {
      ds.Clear();
      FillTables();
    }
 
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
      if(ds.HasChanges())
      {
        DialogResult result = MessageBox.Show("Сохранить?", "Данные были изменены!", MessageBoxButtons.YesNoCancel, 
                              MessageBoxIcon.Information);
        switch(result)
        {
          case System.Windows.Forms.DialogResult.Yes:
            if (ds.Tables[0].GetChanges() != null)
               daContact.Update(ds.Tables[0]);
            if (ds.Tables[1].GetChanges() != null)
               daTypePhone.Update(ds.Tables[1]);
            break;
          case System.Windows.Forms.DialogResult.No:
            Environment.Exit(1);
            break;
          case System.Windows.Forms.DialogResult.Cancel:
            e.Cancel = true;
            break;
        } 
      } 
    } 
  } //class Form1
} // namespace ContactsTest
Хотелось бы, чтобы в DataGridView2 (телефоны контакта) в столбце TypeID отражался тип телефона в текстовом вид из таблице tblTypePhone, а не его идентификатор из этой таблице. Подскажите, пожалуйста, как это можно сделать.
0
Вложения
Тип файла: zip ContactsTest.zip (33.1 Кб, 2 просмотров)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2017, 17:52
Ответы с готовыми решениями:

Как сложить текст из других ячеек в вычисляемую ячейку чтобы был виден текст а не значение ссылок на другие таблицы
С новым годом господа :-) Прошу немного сориентировать в решении нужной мне задачи. Собсно...

Возможно ли сделать так, чтобы введенное в Edit число стало максимальным числом в каком-то столбце StringGrid?
Не понимаю как сделать, помогите пожалуйста. У меня есть StringGrid, поле Edit, возможно ли...

Как сделать так, чтобы планшет был подключен к прокси
Здравствуйте! Есть одна проблема... При подключении к школьному wifi(edu tatar) через учительский...

Как сделать так чтобы был и фон и блочная вёрстка
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ...

Как сделать чтобы текст в текстбоксе был бы в скобках?
как сделать чтобы текст в текстбоксе был бы в скобках?

14
tuchin
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 69
12.02.2017, 17:56  [ТС] 2
И хотелось бы иметь возможность редактировать тип телефона в DataGridView2
0
Козадоев
114 / 110 / 26
Регистрация: 05.03.2013
Сообщений: 636
12.02.2017, 21:22 3
Выбери тип колонки комбобокс. И укажи соответсвующие привязки в его свойствах. В ячейках будет не айди а ткст. Который можно отредактиовать выбрав дугое значение из выпадающего списка.
0
tuchin
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 69
13.02.2017, 07:43  [ТС] 4
Попробовал после FillTables() сделать колонку комбобоксом:
C#
1
      dataGridView2.Columns[3].CellTemplate = new DataGridViewComboBoxCell();
получаю ошибку "Value provided for CellTemplate must be of type System.Windows.Forms.DataGridViewTextBoxCell". Подскажите, пожалуйста, как сделать в коде сделать колонку комбобоксом.
0
13.02.2017, 07:43
Козадоев
114 / 110 / 26
Регистрация: 05.03.2013
Сообщений: 636
13.02.2017, 08:15 5
Цитата Сообщение от tuchin Посмотреть сообщение
Подскажите, пожалуйста, как сделать в коде сделать колонку комбобоксом.
Никогда не надобилось в коде так делать. Чем дизайнер формы не устраивает? В блокноте пишете?

Добавлено через 8 минут
Зашел в дизайнер, глянул как он делает, вот так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private System.Windows.Forms.DataGridViewComboBoxColumn myColumn;
private void InitializeComponent()
        {
this.myColumn= new System.Windows.Forms.DataGridViewComboBoxColumn();
...
 this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
            this.myColumn
          });
 
...
 
       this.myColumn.DataPropertyName = "NameType";
            this.myColumn.DataSource = this.typesBindingSource;
            this.myColumn.DisplayMember = "Name";
            this.myColumn.HeaderText = "Название типа";
            this.myColumn.MinimumWidth = 100;
            this.myColumn.Name = "myColumn";
            this.myColumn.Resizable = System.Windows.Forms.DataGridViewTriState.True;
            this.myColumn.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic;
            this.myColumn.ValueMember = "ID";
0
tuchin
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 69
13.02.2017, 21:26  [ТС] 6
Попробовал сделать по аналогии:
C#
1
2
3
DataGridViewColumn myCol = new DataGridViewComboBoxColumn();
dataGridView2.Columns.AddRange(new DataGridViewColumn[] { myCol});
dataGridView2.Columns[4].DataPropertyName = "NameType";
Появилась в dataGridView2 дополнительная колонка с комбобоксами, но у dataGridView2.Columns[4] не появляется свойство DataSource. Кроме того, мне нужно изменить тип существующей колонки dataGridView2.Columns[3] на комбобокс, а не добавлять новую колонку. Вообщем, пока ничего не получилось, и очень нужна помощь в решении этой проблемы. Проект прикрепил.
0
Вложения
Тип файла: zip ContactsTest.zip (33.3 Кб, 2 просмотров)
Tessio
77 / 100 / 44
Регистрация: 12.05.2015
Сообщений: 476
Завершенные тесты: 1
14.02.2017, 06:33 7
Лучший ответ Сообщение было отмечено tuchin как решение

Решение

tuchin, надо отключить автогенерацию столбцов
C#
1
dataGridView2.AutoGenerateColumns = false;
и самостоятельно создать столбцы с привязанными свойствами
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
dataGridView2.Columns.Add(
    new DataGridViewTextBoxColumn()
    {
        Name = "ID",
        HeaderText = "ID",
        DataPropertyName = "ID"
    });
dataGridView2.Columns.Add(
    new DataGridViewTextBoxColumn()
    {
        Name = "ContactID",
        HeaderText = "ContactID",
        DataPropertyName = "ContactID"
    });
dataGridView2.Columns.Add(
    new DataGridViewTextBoxColumn()
    {
        Name = "Phone",
        HeaderText = "Phone",
        DataPropertyName = "Phone"
    });
dataGridView2.Columns.Add(
    new DataGridViewComboBoxColumn()
    {
        Name = "Type",
        HeaderText = "Type",
        DataPropertyName = "TypeID",
 
        DataSource = ds.Tables[1],
        DisplayMember = "Type",
        ValueMember = "ID"
    });
1
tuchin
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 69
16.02.2017, 21:11  [ТС] 8
Попробовал сделать так, как Вы посоветовали:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
    private void Form1_Load(object sender, EventArgs e)
    {
      DBcon("Contacts.mdb"); // подключение к БД
//      Перенос в таблицы DataSet структуры БД
      daContact = new OleDbDataAdapter("SELECT * FROM tblContact", cn);
      ds.Tables.Add("Contact");
      daContact.FillSchema(ds.Tables["Contact"], SchemaType.Mapped);
      daPhone = new OleDbDataAdapter("SELECT * FROM tblPhone", cn);
      ds.Tables.Add("Phone");
      daPhone.FillSchema(ds.Tables["Phone"], SchemaType.Mapped);
      daTypePhone = new OleDbDataAdapter("SELECT * FROM tblTypePhone", cn);
      ds.Tables.Add("TypePhone");
      daTypePhone.FillSchema(ds.Tables["TypePhone"], SchemaType.Mapped);
//       Создание отношений между таблицами DataSet
      DataRelation ContactPhoneRel = new DataRelation("RelContactPhone", ds.Tables["Contact"].Columns["ID"], 
                                                                         ds.Tables["Phone"].Columns["ContactID"]);
      ds.Relations.Add(ContactPhoneRel);
      DataRelation TypePhonePhoneRel = new DataRelation("RelTypePhonePhone", ds.Tables["TypePhone"].Columns["ID"], 
                                                                             ds.Tables["Phone"].Columns["TypeID"]);
      ds.Relations.Add(TypePhonePhoneRel);
//       Создание отношений между DataGridView
      dataGridView1.DataSource = bsContact;
      dataGridView2.DataSource = bsPhone;
      bsContact.DataSource = ds;
      bsContact.DataMember = ds.Tables["Contact"].TableName;
      bsPhone.DataSource = bsContact;
      bsPhone.DataMember = ds.Relations["RelContactPhone"].RelationName;
      dataGridView2.AutoGenerateColumns = false;
      dataGridView2.Columns.Add(
        new DataGridViewTextBoxColumn()
        {
          Name = "ID",
          HeaderText = "ID",
          DataPropertyName = "ID"
        });
      dataGridView2.Columns.Add(
        new DataGridViewTextBoxColumn()
        {
          Name = "ContactID",
          HeaderText = "ContactID",
          DataPropertyName = "ContactID"
        });
      dataGridView2.Columns.Add(
        new DataGridViewTextBoxColumn()
        {
          Name = "Phone",
          HeaderText = "Phone",
          DataPropertyName = "Phone"
        });
      dataGridView2.Columns.Add(
        new DataGridViewComboBoxColumn()
        {
          Name = "Type",
          HeaderText = "Type",
          DataPropertyName = "TypeID",
          DataSource = ds.Tables["TypePhone"],
          DisplayMember = "Type",
          ValueMember = "ID"
        });
      FillTables(); // Заполнение таблиц DataSet
      OleDbCommandBuilder cmdPhone     = new OleDbCommandBuilder(daPhone);
      OleDbCommandBuilder cmdContacts = new OleDbCommandBuilder(daContact);
      ds.Dispose();
      cn.Close();
    }
Но к сожалению у меня получились дублирующие столбцы. Видимо, они появились из-за того, что я сначала создал структуру таблицы Phone с помощью FillShema, а затем еще и добавил столбцы. Подскажите, пожалуйста, как сделать так, чтобы сохранить и отношение между Contacts и Phone, и показывать текст из таблицы TypePhone в столбце TypeID DataGridView2. Проект прикрепил.
0
Вложения
Тип файла: zip ContactsTest-дубли столбцов.zip (33.4 Кб, 3 просмотров)
Tessio
77 / 100 / 44
Регистрация: 12.05.2015
Сообщений: 476
Завершенные тесты: 1
16.02.2017, 22:31 9
Лучший ответ Сообщение было отмечено tuchin как решение

Решение

Цитата Сообщение от tuchin Посмотреть сообщение
Видимо, они появились из-за того, что я сначала создал структуру таблицы
Нет, это произошло потому что вы сначала привязали все к datagridview.
C#
1
dataGridView2.AutoGenerateColumns = false;
Перенесите до этих строк
C#
1
2
bsPhone.DataSource = bsContact;
bsPhone.DataMember = ds.Relations["RelContactPhone"].RelationName;
можно в начало обработчика.
1
tuchin
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 69
17.02.2017, 10:41  [ТС] 10
Спасибо за ответ. Перенес строку и дубли исчезли, но возникла другая проблема. Ввожу типы телефонов из комбобокса, все сохраняется без ошибок. Однако при повторном запуске программы возникает ошибка (скриншот прикрепил). Посмотрел в базе данных - все нормально, типы телефонов вводятся правильно. Возникли следующие вопросы:
1. Почему возникает эта ошибка и как ее исправить?
2. Как перехватывать эту ошибку и проанализировать ее, чтобы выяснить причину и локализовать строку в программе, которая эту ошибку вызывает?
0
Миниатюры
Как сделать так, чтобы в столбце таблицы был текст, а не число?  
Tessio
77 / 100 / 44
Регистрация: 12.05.2015
Сообщений: 476
Завершенные тесты: 1
17.02.2017, 11:33 11
Лучший ответ Сообщение было отмечено tuchin как решение

Решение

tuchin, поменяйте порядок заполнения таблиц
C#
1
2
3
4
5
6
private void FillTables()
{
    daContact.Fill(ds.Tables["Contact"]);
    daTypePhone.Fill(ds.Tables["TypePhone"]);
    daPhone.Fill(ds.Tables["Phone"]);
}
1
tuchin
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 69
17.02.2017, 13:10  [ТС] 12
Спасибо большое! Все заработало! Сколько же нюансов!
0
tuchin
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 69
20.02.2017, 20:24  [ТС] 13
Столкнулся с проблемой. Если из базы удалить все записи, то при попытке ввести новую запись, например, в DataGridView1 в идентификторе появляется 0 (ноль). Я исправил 0 на 1 и ввел вторую запись (ID второй записи установилось в 2). Затем нажал кнопку записать и обновить. Номера записи стали 17 и 18. Вышел из программы и снова ее запустил - вижу ID 17 и 18. Удаляю записи, появляется номер 20, ввожу вторую запись - номер 21. Выхожу из программы, запускаю снова - номер записей 19 и 20. Помогите, пожалуйста, разобраться, почему так странно работает программа. Проект прикрепил.
0
Вложения
Тип файла: zip ContactsTest.zip (36.6 Кб, 4 просмотров)
Tessio
77 / 100 / 44
Регистрация: 12.05.2015
Сообщений: 476
Завершенные тесты: 1
21.02.2017, 01:06 14
tuchin, это такая особенность работы в datagridview с полями первичного ключа имеющие автоинкремент. Обычно делают чисто косметические какие-то шаги, чтобы такие поля корректно отображались, например запрещают редактирование в datagridview, а записи добавляют через отдельную форму, а если нет необходимости отображать подобные столбцы, то их скрывают.
Возможно существуют какие-то способы, чтобы полностью имитировать работу БД, но, к сожалению, я их не знаю, да и не считаю это необходимым.
0
tuchin
2 / 2 / 1
Регистрация: 13.10.2014
Сообщений: 69
21.02.2017, 08:03  [ТС] 15
Спасибо, понял
0
21.02.2017, 08:03
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2017, 08:03

Как сделать чтобы на картинки был любой текст?
Как сделать чтобы на картинки был любой текст??? или например яхочу чтобы на картинки был виден...

Как сделать так,чтобы мой сайт был найден в гугл
Ребята подскажите, пожалуйста, как сделать, чтоб мой сайт обнаружил гугл. Прописываю в гугл,...

Как сделать так, чтобы JLabel был всегда на переднем плане?
Создаю JLabel поверх header'а JTable. Эта штука благополучно создаётся и выводится на экран. Но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.